문제 해석
내가 작성한 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
br.close();
if(N == 1){
return;
}
for(int i = 2; i <= N; i++){
while(N%i == 0){
N /= i;
sb.append(i + "\n");
}
}
System.out.println(sb);
}
}
효율적인 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import static java.lang.Math.sqrt;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
br.close();
//sqrt 메소드는 파라미터의 양의 제곱근을 반환
for(int i = 2; i <= sqrt(N); i++){ //1을 제외하고
while(N%i == 0){
N /= i;
sb.append(i + "\n");
}
}
if(N != 1){
sb.append(N);
}
System.out.println(sb);
}
}
효율적인 코드 결과
내 코드와 다른 점
가장 크게 다른 점은 N의 제곱근을 사용했다는 점이다.
72로 예시를 들자면,
1, 2, 3, 4, 6, 8, 9, 12, 18, 24, 36, 72
1은 소수에 해당되지 않기때문에 1X72쌍은 제외한다.
그러면, 2X36, 3X24, 4X18, 6X12, 8X9과 같이 나타낼 수 있는데 한 쌍에서 인수 중 하나는 무조건 72의 제곱근인 8.4852813742386 보다 작다는 것을 알 수 있다.
즉, sqrt 메서드를 활용하여 N의 양의 제곱근을 구하여 N까지 반복할 필요 없이 제곱근 이하로만 반복해도 된다!
(그 이유, N이 어떠한 수로 나눠진다는 것은 쌍을 이루는 다른 수도 포함한다는 뜻이기 때문)
반복문이 끝나면 소인수분해가 된 N은 1이 되어야한다.
하지만, 반복문이 끝나도 N이 1이 되지 않는 경우가 있다.
- 이러한 경우는 제곱근을 쓰지 않는다면 문제가 되지 않지만, 만약 제곱근을 쓴다면 마지막 N이 1이 아닌 경우 StringBuilder에 N을 append해줘야한다.
예시를 들자면, 46으로 들 수 있다.
46의 제곱근은 6.78232998313 이며, 1, 2, 23, 46이다.
if(N != 1){
sb.append(N);
}
느낀점