코딩 테스트

[코딩테스트] 백준 11653번: 소인수분해

dev.jelee 2025. 8. 3. 21:53

# 문제

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


# 코드

v1

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

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

    int N = Integer.parseInt(br.readLine());
    int temp = N;
    int i = 2;
    
    // 소인수분해 할때 나누기 값을 nums에 저장.
    List<Integer> nums = new ArrayList<>();
    while (temp > 1) {
      if (temp < 2) { return; }
      if (temp % i == 0) {
        nums.add(i);
        temp = temp / i;
      } else {
        i++;
      }
    }

    for (int n : nums) {
      System.out.println(n);
    }
  }
}

v2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class BOJ11653_v2 {
  public static void main(String[] args) throws IOException {
    int N = readInput();
    if (N < 2) {
      return;
    }

    List<Integer> factors = getPrimeFactors(N);
    printFactors(factors);
  }

  // 입력 메서드
  private static int readInput() throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    return Integer.parseInt(br.readLine());
  }

  // 소인수분해 계산
  private static List<Integer> getPrimeFactors(int number) {
    List<Integer> result = new ArrayList<>();
    int divisor = 2;

    while (number > 1) {
      if (number % divisor == 0) {
        result.add(divisor);
        number /= divisor;
      } else {
        divisor++;
      }
    }
    
    return result;
  }

  // 출력 계산
  private static void printFactors(List<Integer> factors) {
    for (int factor : factors) {
      System.out.println(factor);
    }
  }
}

v3

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class BOJ11653_v3 {
  public static void main(String[] args) throws IOException {
    PrimeFactorizer factorizer = new PrimeFactorizer();
    int number= factorizer.readInput();

    if (number < 2) {
      return;
    }

    List<Integer> result = factorizer.factorize(number);
    factorizer.printFactors(result);
  }
}

// PrimeFActorizer 클래스 생성
class PrimeFactorizer {

  // 입력 메서드
  public int readInput() throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    return Integer.parseInt(br.readLine());
  }

  // 계산 메서드
  public List<Integer> factorize(int number) {
    List<Integer> factors = new ArrayList<>();

    for (int i = 2; i * i <= number; i++) {
      while (number % i == 0) {
        factors.add(i);
        number /= i;
      }
    }

    // 남은 수가 소수라면 그 수도 결과에 포함
    if (number > 1) {
      factors.add(number);
    }

    return factors;
  }

  // 출력 메서드
  public void printFactors(List<Integer> factors) {
    factors.forEach(System.out::println);
  }
}

# 입/출력 결과

v1


v2


v3


# 과정

v1

// 풀이 내용: 
// 1. BufferedReader로 입력값 받기.
// 2. int N에 입력값 받아서 저장.
// 3. int temp에 N 값 저장.
// 4. int i = 2 초기화 및 선언
// 5. List<Integer> 타입으로 nums 선언.
// 6. while문을 사용하여 소인수분해 계산하기.
//    - N입력값이 1이면 아무것도 출력 x
//    - 소인수분해 했을 때 나눈 값을 nums에 .add()하여 저장.
// 7. nums를 한 줄씩 출력.

v2

// 1. BufferedReader로 입력값 받기.
// 2. 입력용 메서드 readInput(), 소인수분해 계산 메서드 getPrimeFactors(), 출력 메서드 printFactors() 생성.

v3

// 풀이 내용: 
// 1. BufferedReader로 입력값 받기.
// 2. Class 분리하여 분리한 클래스에서 입력 메서드, 계산 메서드, 출력 메서드 생성.

# 메모

  • 처음 내가 작성한 코드는 main 메서드에서 모든 것을 계산하는 방법이었다.
  • chat gpt한테 중급과 고급 버전으로 리팩토링을 해달라고 요청을 했고 두 가지의 리팩토링을 받았다.
  • 중급은 main메서드와 입력 메서드 readInput(), 계산 메서드 getPrimeFactors(), 출력 메서드 printFactors()를 생성하는 방식이었다.
  • 고급은 Class를 분리하여 분리한 클래스에서 입력 메서드, 계산 메서드, 출력 메서드를 생성하는 방식이었다. 그래서 메인이 되는 클래스에서 분리한 클래스를 인스턴스화 하여 내부 메서드를 호출하는 방식이다.