Algorithm/Baekjoon(Java)
[백준/JAVA] 11653 : 소인수분해 ( 기본 수학 2 )
비망노트
2022. 8. 9. 21:11
문제
정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.
입력
첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.
출력
N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.
예제입력 | 예제출력 |
72 | 2 2 2 3 3 |
3 | 3 |
6 | 2 3 |
2 | 2 |
9991 | 97 103 |
⭕ 풀이
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int input = Integer.parseInt(br.readLine());
br.close();
StringBuilder sb = new StringBuilder();
while(input>1){
for(int i=2;i<=input;i++){
if(input%i==0){
sb.append(i).append("\n");
input /= i;
break;
}
}
}
System.out.print(sb.toString());
}
}
✅ 입력받은 수를 i로 나눈 나머지가 0이라면 i를 append한뒤 입력받은수를 i로 나누고 break;
이를 반복하며 while문의 조건이 false가 되면 sb를 출력하는데
입력받은수가 1이라면 처음부터 만족하지못하므로 StringBuilder sb 에는 아무것도 들어가지않는다.
✅ 다른분의 풀이참조
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();
for (int i = 2; i <= Math.sqrt(N); i++) {
while (N % i == 0) {
sb.append(i).append('\n');
N /= i;
}
}
if (N != 1){sb.append(N);}
System.out.println(sb);
}
}
이게 무슨식이지 하고 생각했었는데 입력받은수의 제곱근을 i로 나누었다.
특정 수의 제곱근까지 둘러보았는데 나누었을때 0 이 되는수가 없다면 해당수는 그자체로 소수인 수이다..
예제인 9991로 예를들면 9991의 제곱근은 99.95498987044118이 나오는데
여기서 나누었을때 나머지가 0이되는 수가 있는지는 99 까지만 찾아보면 된다는 뜻이된다.
결국 97로 나누었을때 나머지가 0 이 되었고
input은 103이 되었는데 103의 제곱근은 10.14889156509222 인데
이미 i가 10을 넘어있는 상태이므로 for문이 끝나고 나가 if문으로 간다
103 != 1이므로 103도 sb에 append 해준다.
-출처