백준 수 복원하기

KIMYEONGJUN·2025년 5월 15일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 테스트 케이스의 수가 주어진다.
각 테스트 케이스마다 양의 정수 N (2 ≤ N ≤ 100,000)이 주어진다.

각 테스트 케이스마다 각 인수와 그 인수가 곱해진 횟수를 한 줄씩 출력한다.
출력 순서는 인수가 증가하는 순으로 한다.

내가 이 문제를 보고 생각해본 부분

BufferedReader를 사용하여 표준 입력을 읽는다.
첫 줄에서 테스트 케이스의 수 T를 읽어온다.
T만큼 반복하면서 각 테스트 케이스를 처리해준다..
각 테스트 케이스에서는 정수 N을 읽어온다.
i를 2부터 시작하여 i * i <= N인 동안 반복한다. 
이 조건은 i가 N의 제곱근까지 확인하면 충분하다는 것을 의미하며 효율적이다.
만약 N이 i로 나누어떨어진다면, i는 N의 소인수이다.
while 반복문을 통해 N이 더 이상 i로 나누어떨어지지 않을 때까지 계속 나누면서 count를 증가시킵니다. 이 count가 소인수 i의 지수이다.
i와 count를 출력한다.
i를 1 증가시키고 다음 소인수 후보를 확인한다.
for 반복문이 끝난 후, 만약 N이 1보다 크다면, 이는 처음에 입력받은 N의 소인수 중 sqrt(원본 N)보다 큰 소인수가 남은 경우이다. 
이 남은 N은 반드시 소수이며, 지수는 1입니다. 따라서 남은 N과 1을 출력한다.
소인수를 2부터 순차적으로 확인하기 때문에 출력 순서도 소인수가 증가하는 순서가 된다.

코드로 구현

package baekjoon.baekjoon_28;

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

// 백준 2312번 문제
public class Main1022 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine()); // 테스트 케이스의 수

        for(int t = 0; t < T; t++) {
            int N = Integer.parseInt(br.readLine()); // 양의 정수 N

            // 소인수분해 로직
            for(int i = 2; i * i <= N; i++) {
                if(N % i == 0) {
                    int count = 0;
                    // 현재 i가 N의 소인수인 경우, 몇 번 나누어지는지 확인
                    while(N % i == 0) {
                        N /= i;
                        count++;
                    }
                    // 소인수와 그 지수 출력
                    System.out.println(i + " " + count);
                }
            }

            // 위 반복문이 끝난 후 N이 1보다 크다면, 남은 N 자체가 소수이다.
            if(N > 1) {
                System.out.println(N + " " + 1);
            }
        }

        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글