카테고리 없음

[백준] 11653 : 소인수분해(JAVA)

송테이토 2022. 11. 7. 14:40

소인수분해

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율

1 초 256 MB 73515 39405 30680 52.237%

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

출력

N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.

예제 입력 1

72

예제 출력 1

2
2
2
3
3

예제 입력 2

3

예제 출력 2

3

예제 입력 3

6

예제 출력 3

2
3

예제 입력 4

2

예제 출력 4

2

예제 입력 5

9991

예제 출력 5

97
103

방법1.

package Day1106;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class B11653 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int N = Integer.parseInt(br.readLine());
		int i = 2;

		//n이 1이 될 때까지 반복
		while (N != 1) {

			if (N % i == 0) {
				N /= i;
				sb.append(i + "\\n");
			} else {
				i++;
			}
		}
		System.out.println(sb);
	}

}

방법2. - 제곱근으로 소수찾아서 나누기(추천!!)

N이 72면 72까지 i를 다 돌리는게 아니라 72에 제곱근까지만 찾아주면 시간이 훨씬 줄어들것이다.

package Day1106;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class B11653_2 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int N = Integer.parseInt(br.readLine());

		for (int i = 2; i <= Math.sqrt(N); i++) { // 또는 i * i <= N
			while (N % i == 0) {
				sb.append(i + "\\n");
				N /= i;
			}
		}

		//N이 소수일 경우 그대로출력
		if (N != 1) {
			sb.append(N);
		}
		System.out.println(sb);
	}
}

소수찾기

	for (int i = 2; i <= Math.sqrt(num); i++) {
			if (num % i == 0)
				return false;
		}

 





처음 틀린코드

package Day1106;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class B11653 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int N = Integer.parseInt(br.readLine());

		int i = 2;
		while (true) {
			if (N <= 0)
				break;
			if (N % i == 0) {
				N /= i;
				sb.append(i+"\\n");
				i = 2;
			} else {
				i++;
			}
		}
		System.out.println(sb);
	}

}

시간초과로 나온다….

while을 트루로해서그런가..?