-
[프로그래머스/JAVA] 소수 만들기Algorithm/Java 2025. 2. 6. 09:37
https://school.programmers.co.kr/learn/courses/30/lessons/12977
[ 오답 노트 ]
❌ 기존 오답 코드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; } }
반응형'Algorithm > Java' 카테고리의 다른 글
[프로그래머스/JAVA] 소수 찾기 (0) 2025.02.03 [프로그래머스/JAVA] 과일 장수 (0) 2025.02.03 [프로그래머스/JAVA] 튜플 (2019 카카오 개발자 겨울 인턴십 문제) (1) 2025.01.28 [프로그래머스/JAVA] [1차] 캐시 (2018 KAKAO BLIND RECRUITMENT 문제) (1) 2025.01.27 [프로그래머스/JAVA] 2016년 (1) 2025.01.27