Algorithm/Java
[프로그래머스/JAVA] 소수 만들기
dbfl9911
2025. 2. 6. 09:37
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/12977
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
[ 오답 노트 ]
❌ 기존 오답 코드
class Solution {
public boolean isDemic(int num) {
// 소수 판별
for(int i = 2; i <= (int)Math.sqrt(num); i++) {
if(num % i == 0) {
return false;
}
}
return true;
}
public int solution(int[] nums) {
// 입출력 예 #1 [1,2,3,4]
// [1,2,3] -> 1 + 2 + 3 = 6 (소수 x)
// [인덱스0, 인덱스 1, 인덱스2]
// [1,2,4] -> 1 + 2 + 4 = 7 (소수 O)
// [인덱스0, 인덱스 1, 인덱스3]
// [1,3,4] -> 1 + 3 + 4 = 8 (소수 x)
// [인덱스0, 인덱스 2, 인덱스3]
// [2,3,4] -> 2 + 3 + 4 = 9 (소수 x)
// [인덱스1, 인덱스 2, 인덱스3]
int answer = 0;
for(int i = 0; i < nums.length; i++) {
int sum = 0;
for(int j = i; j < nums.length; j++) {
for(int x = j; x < nums.length; x++) {
sum += (nums[i] + nums[j] + nums[x]);
}
// 소수 판별
if(isDemic(sum)) {
answer++;
}
}
}
return answer;
}
}
📌 기존 코드의 문제점 및 해결 방안
1. 내부 for문 루프 오류 해결
- 내부 for문 루프에서 j = i, x = j로 설정하여 중복된 숫자를 선택할 가능성이 있어, 조합을 만들 때 다른 숫자 세개를 선택해야 하지만 같은 숫자가 포함될 수 있음.
- j = i+1, x = j+1로 설정하여 서로 다른 숫자 3개를 선택하도록 해결하고, 각각 for문 루프의 범위도 정확하게 수정한다.
2. 합계(sum) 계산 위치 오류 해결
- sum을 한 번 선언하고 반복문 안에서 누적하는 방식이므로 잘못된 값이 나올 수 있음
- sum을 내부 루프에서 초기화하여 올바른 조합의 합을 구하도록 해 해결
// 첫번째 숫자 탐색
for(int i = 0; i < nums.length - 2; i++) { // 마지막 두개의 숫자 남아있어야함.
// 두번째 숫자 탐색
for(int j = i+1; j < nums.length - 1; j++) { // 마지막 한개의 숫자 남아있어야함.
// 세번째 숫자 탐색
for(int x = j+1; x < nums.length; x++) {
int sum = nums[i] + nums[j] + nums[x];
// 소수 판별
if(isDemic(sum)) {
answer++;
}
}
}
}
📌 정답 코드
class Solution {
public boolean isDemic(int num) {
// 소수 판별
for(int i = 2; i <= Math.sqrt(num); i++) {
if(num % i == 0) {
return false;
}
}
return true;
}
public int solution(int[] nums) {
// 입출력 예 #1 [1,2,3,4]
// [1,2,3] -> 1 + 2 + 3 = 6 (소수 x)
// [인덱스0, 인덱스 1, 인덱스2]
// [1,2,4] -> 1 + 2 + 4 = 7 (소수 O)
// [인덱스0, 인덱스 1, 인덱스3]
// [1,3,4] -> 1 + 3 + 4 = 8 (소수 x)
// [인덱스0, 인덱스 2, 인덱스3]
// [2,3,4] -> 2 + 3 + 4 = 9 (소수 x)
// [인덱스1, 인덱스 2, 인덱스3]
int answer = 0;
// 첫번째 숫자 탐색
for(int i = 0; i < nums.length - 2; i++) { // 마지막 두개의 숫자 남아있어야함.
// 두번째 숫자 탐색
for(int j = i+1; j < nums.length - 1; j++) { // 마지막 한개의 숫자 남아있어야함.
// 세번째 숫자 탐색
for(int x = j+1; x < nums.length; x++) {
int sum = nums[i] + nums[j] + nums[x];
// 소수 판별
if(isDemic(sum)) {
answer++;
}
}
}
}
return answer;
}
}
반응형