-
소수 구하기(프로그래머스 lv1)알고리즘 2023. 1. 30. 14:48
문제
- n개의 수를 입력하는 배열 입력
- 그 배열에서 임의의 3개의 수를 더한 값이 소수인 경우가 몇번인지를 구하시오.
입력
5 1 2 7 6 4
//결과 4
내가 해결한 방식
- 일단 임의의 세개의 수를 더하는 로직을 구현
for(int i = 0; i < n; i++){ for(int j = i+1; j < n; j++){ for(int k = j+1; k < n; k++){ if(k != 0) { int tmp = nums[i] + nums[j] + nums[k]; if(validation(tmp)) cnt++; } } }
배열 내 세번씩 더하는 경우의 수는 삼중포문으로 위와 같이 로직을 구현해야 한다. 그런데 만약 k라는 값이 0이라면 세개의 값을 더하는 것이 아닌 두개의 값만을 구하는 것이기 때문에 조건에 맞지 않는다. 그러므로 if(k≠0)일 경우에만 소수 값을 찾는다.
validation 메소드로 소수를 검증했을 때 true를 반환한다면 소수인 경우이므로 cnt 변수를 증가시켜준다.
- 임의의 세개의 수가 소수인지 아닌지를 검증하는 메서드 생성
public boolean validation(int num){ if(num == 1) return false; if(num == 2) return true; for(int i = 2; i < num; i++){ if(num % i == 0) return false; } return true; }
소수 값은 2부터 유효하므로 if(num == 1) return false로 구현했고, for문을 돌렸을 때 만약 num 값이 2라면 num % i 값이 0이 나오게 되므로 false가 나오게 되는데 2 값은 소수이므로 그래선 안된다. 이를 방지하기 위해 if(num == 2) return true;로 선언해줬다.
만약 for문을 돌았는데 if문을 충족시키지 못한다면 소수라는 의미이므로 return true를 반환해주었다.
- for문을 벗어났을 때 cnt 값이 소수가 될 수 있는 경우의 수 이므로 이를 answer에 담아 출력한다.
//전체 로직 import java.util.Scanner; public class MakeSosu { public boolean validation(int num){ if(num < 2) return false; if(num == 2) return true; for(int i = 2; i < num; i++){ if(num % i == 0) return false; } return true; } public int solution(int[] nums) { int answer = -1; int cnt = 0; int n = nums.length; for(int i = 0; i < n; i++){ for(int j = i+1; j < n; j++){ for(int k = j+1; k < n; k++){ if(k != 0) { int tmp = nums[i] + nums[j] + nums[k]; if(validation(tmp)) cnt++; } } } } answer = cnt; return answer; } public static void main(String[] args) { MakeSosu T = new MakeSosu(); Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++){ arr[i] = in.nextInt(); } System.out.print(T.solution(arr)); } }
'알고리즘' 카테고리의 다른 글
[프로그래머스][lv2] 멀쩡한 사각형 Java (0) 2023.02.01 [프로그래머스][lv2] 점프와 순간이동 Java (0) 2023.01.31 [프로그래머스][lv2] 방문길이 Java (0) 2023.01.31 그리디 알고리즘 (0) 2022.01.05 해쉬 (0) 2021.12.05