# 문제
주소: 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를 분리하여 분리한 클래스에서 입력 메서드, 계산 메서드, 출력 메서드를 생성하는 방식이었다. 그래서 메인이 되는 클래스에서 분리한 클래스를 인스턴스화 하여 내부 메서드를 호출하는 방식이다.
'코딩 테스트' 카테고리의 다른 글
[코딩테스트] 백준 2581번: 소수 (0) | 2025.08.02 |
---|---|
[코딩테스트] 백준 1978번: 소수 찾기 (0) | 2025.08.01 |
[코딩테스트] 백준 9506번: 약수들의 합 (0) | 2025.07.28 |
[코딩테스트] 백준 2501번: 약수 구하기 (0) | 2025.07.28 |
[코딩테스트] 백준 5086번: 배수와 약수 (0) | 2025.07.28 |