일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 어려웠던 문제
- 쿼드압축 후 개수세기
- HashMap
- python
- 순열
- 후위 표기법
- 영문자 확인
- dfs
- Stack
- 완전탐색
- 튜플
- 규칙찾기
- HashSet
- 조합
- 보이어무어
- Dynamic Programming
- 2017 카카오 코드
- 문자열
- pandas
- 에라토스테네스의 체
- 메뉴리뉴얼
- 최소공배수
- Java
- fragment identifier
- 동적계획법
- 반복문
- 알고리즘
- 완전 탐색
- 점프와 순간이동
- 프로그래머스
- Today
- Total
csmoon1010의 SW 블로그
[201109] 소수 만들기 - Summer/Winter Coding(~2018) (level2) 본문
[201109] 소수 만들기 - Summer/Winter Coding(~2018) (level2)
csmoon1010 2020. 11. 10. 13:560. 문제 유형 : 조합(완전탐색, 재귀), 소수(에라토스테네스의 체)
1. 문제 이해
(1) 주요 요구사항
- nums : 숫자들이 들어가 있는 배열
- nums 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 return
(2) 제한사항
- nums의 길이 : 3개 이상 50개이하 → 완전탐색 가능
- nums의 원소 : 1이상 1000이하 → 3개 수의 합 < 3000, int형 사용 가능
- nums의 원소 : 중복된 숫자 없음 → 중복 조합 상황 고려X
2. 전략
(1) 소수 판단 : public boolean[] calcPrime(int n)
- 나올 수 있는 소수의 범위 : 3000보다 작음
▶ 3000까지의 수에 대해 에라토스테네스의 체로 소수 구하기
- 에라토스테네스의 체
① 소수 여부를 체크할 수 있는 boolean 배열(prime)을 하나 관리
② 2부터 순차적으로 배수인 경우 boolean 배열의 값을 true로 변경
③ false인 경우만 소수에 해당
(2) 각 조합에 대해서 소수인지 확인 : public void calculate(int[] nums, int n, int k, int level, int target, int sum)
- 조합 구하기, 종료 조건에 소수 확인 과정 추가
① target번째 수의 선택 여부 결정 (단, target의 index가 n보다 작을 때까지만)
- 선택한다면? : sum에 nums[target] 추가
② target을 옮겨서 재귀 호출 (조합이므로 더이상 앞의 수들은 고려X - 이미 선택여부가 끝난것!!)
③ k가 0이 되면 sum이 소수인지 prime 배열을 통해 확인, 맞다면 answer값 증가
3. 참고사항
(1) 소수 확인 과정
: 각 경우의 수에 대해서 2~Math.sqrt(n) 까지의 수를 나누는 방법도 있음
▶ 경우의 수가 적은 경우는 더 유리, 경우의 수가 많고 수가 큰 경우에는 반복계산으로 인한 시간 증가
(2) 시간 복잡도 :
4. 코드
class Solution {
public boolean[] prime;
public int answer;
public int solution(int[] nums) {
answer = 0;
prime = calcPrime(3000);
calculate(nums, nums.length, 3, 0, 0);
return answer;
}
public void calculate(int[] nums, int n, int k, int target, int sum){ //visited 필요? - sum으로 대체, 시간복잡도줄임
if(k == 0){
if(!prime[sum]) answer++;
}
else{
if(target < n){
calculate(nums, n, k, target+1, sum);
calculate(nums, n, k-1, target+1, sum+nums[target]);
}
}
}
public boolean[] calcPrime(int n){
boolean[] result = new boolean[n+1];
result[0] = true; result[1] = true;
for(int i = 2; i <= Math.sqrt(n); i++){
if(!result[i]){
for(int j = 2; i*j < n+1; j++){
result[i*j] = true;
}
}
}
return result;
}
}
'Coding Test > 프로그래머스' 카테고리의 다른 글
[201113] 후보키 - 2019 KAKAO BLIND RECRUITMENT(level2) ★ 비트마스크 ★ (0) | 2020.11.13 |
---|---|
[201111] 오픈채팅방 - 2019 KAKAO BLIND RECRUITMENT(level2) (0) | 2020.11.11 |
[201107] 짝지어 제거하기 - 2017 팁스타운(level2) (0) | 2020.11.10 |
[201106] 쿼드압축 후 개수 세기 - 월간 코드 챌린지 시즌1(level2) (0) | 2020.11.06 |
[201106] 수식 최대화 - 2020 카카오 인턴십(level2) (0) | 2020.11.06 |