(Java) 백준 11653번 - 소인수분해

코딩너구리·2026년 1월 26일

코딩 문제 풀이

목록 보기
182/266

https://www.acmicpc.net/problem/11653

문제

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

접근

소인수분해는 어떤 수를 소수들의 곱으로 표현하는 것이므로 주어진 수를 소수인지 판별하고 맞으면 그대로 출력, 아니면 2부터 증가하는 수로 나눠질 때까지 나누고 갱신 된 수에 이 과정을 반복해 1이 될 때 까지 한다.

문제해결

> 수가 2보다 작으면 소수가 아니므로 false를 반환하고
2보다 크고 N의 제곱수이한인 수 중 하나로 나눠지면 또 fasle를 반환하고
아니면 true를 반환해 소수라고 판정하는 메소드를 만든다.
> 어떤 수가 1보다 클 때까지 반복하는데 일단 그 수가 소수인지 본다.
> 소수라면 해당 수를 자기 자신으로 나누고 아니라면 2부터 해당 수 까지 하나씩 나누어본다.
> 나누어 떨어지면 그 수를 소인수로 가진다는 뜻이므로 출력한다.
> 이 과정을 N이 전부 나누어져 1이될 때까지 반복한다.

코드

import java.io.*;
import java.util.*;
import java.lang.*;

public class Main
{
    //11653번 소인수분해
    static boolean prime(int n)
    {
        if(n < 2) return false;
        for(int i = 2; i * i <= n; i++) if(n % i == 0) return false;
        return true;
    }
    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();

        while(N > 1)
        {
            if(prime(N)) //소수면
            {
                sb.append(N).append('\n');
                N /= N;
                continue;
            }
            for(int i = 2; i <= N; i++)
            {
                if(N % i == 0)
                {
                    sb.append(i).append('\n');
                    N /= i;
                    break;
                }
            }
        }
        System.out.print(sb);
    }
}

후기

내 코드상 만약 2로 나누어지면 반복문을 깨고 다시 while문에서 돌아와 또 2부터 for문을 시작한다. 이 과정이 너무 비효율 적이라고 생각했고 효율적으로 할 수 있게 알아봤다.
2부터 반복하는데 만약 어떤 수로 나누어 떨어지면, while문으로 들어가 해당 수로 안나눠떨어질 때까지 계속 나누면 된다.
그럼 예를들어 72는 2로 나눠서 36이되고, 또 2로 나눠서 18이 되고, 또 2로나눠서 9가 된다. 그리고 i++로 인해 i가 3이 되어 3을 나눠 3이 되고, 또 3으로 나눠 1이 된다.
이런

0개의 댓글