코딩 테스트/프로그래머스
[프로그래머스] 숫자 블록
sangjin98
2024. 3. 22. 00:06
반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/12923
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 분석
[제한 사항]
- 1 ≤ begin ≤ end ≤ 1,000,000,000
- end - begin ≤ 5,000
번호가 n 일 경우 n*2, n*3, n*4 ... 위치에 해당 블록을 설치한다.
예를 들면 2번 블록은 4, 6, 8 ... 번 위의 블록에 설치된다.
도로에 1부터 10,000,000 까지의 숫자가 적힌 블록들을 위의 규칙대로 설치하고 begin ~ end 까지의 블록 상태를 반환하는 문제이다.
문제 접근
end의 범위가 크기 때문에 모든 블록을 깔고 해당 범위의 블록을 반환하게 되면 시간초과가 날 것이다.
따라서 해당 범위에서 바로 어떤 블록이 깔리는 지를 계산해야 한다.
n번 째 타일에는 n을 나눠 나머지가 0인 가장 큰 수가 온다는 규칙을 찾을 수 있다.
예를 들어 10번 째 타일에는 5가 온다. (10 % 5 == 0)
여기서 주의할 점이 있는데 블록이 10,000,000 까지만 있다는 것이다.
end 범위보다 작기 때문에 이 부분을 주의해서 조건을 넣어주어야 한다.
코드
import java.util.*;
class Solution {
public int[] solution(long begin, long end) {
int[] answer = new int[(int)(end-begin) + 1];
for(long i=begin; i<=end; i++){
answer[(int)(i-begin)] = (int)maxDivisor(i);
}
return answer;
}
public static long maxDivisor(long num){
int result = 1;
if(num == 1){
return 0;
}
for(int i=2; i<=Math.sqrt(num); i++){
if(num % i == 0){
System.out.println(i);
if(num / i <= 10000000){
result = Math.max(result, (int) (num / i));
break;
}else{
result = Math.max(result, i);
}
}
}
return result;
}
}반응형