-
프로그래머스 : 소수 찾기코딩테스트 문제 풀이/프로그래머스 2023. 11. 21. 00:01
실패한 내 코드
질문하기에서 에라토스테네스의 체를 이용하면 된다고 문제를 해결한 사람들이 작성해뒀어서 내 나름 에라토스테네스의 체를 이용해본 코드였다 🥲 이 코드로는 마지막 테스트 케이스 3개에서 계속 시간초과가 떠서 해결하지 못했다. 내가 생각했던 코드중에 그나마 시간 비용을 줄인 코드였어서 기록! ✏️
import java.util.ArrayList; class Solution { public int solution(int n) { int answer = 0; ArrayList<Integer> list = new ArrayList<>(); for (int i = 2; i <= n; i++) { list.add(i); } for (int i = 0; i < list.size(); i++) { int findNum = list.get(i); int j; for (j = 2; j < findNum; j++) { if ( findNum % j == 0) break; } if (j != findNum) { list.remove(i); i--; } else { // 소수 찾음 -> 소수의 배수들 모두 제거 for (j = 2; j * findNum < list.get(list.size() - 1); j++) { if (list.contains(j * findNum)) { list.remove(list.indexOf(j * findNum)); } } } } answer = list.size(); return answer; } }
- 와 사용된 메모
이 문제만 오늘 오후 7시까지 온종일 붙들고 있었는데 다른 사람 코드를 봐도 이해가 가지않아 챗GPT를 갈궈봤다.. 히히 정말 놀라운 코드가 나왔다.
챗GPT
import java.util.Arrays; class Solution { public int solution(int n) { boolean[] isPrime = new boolean[n + 1]; Arrays.fill(isPrime, true); int count = 0; for (int i = 2; i * i < n; i++) { if (isPrime[i]) { for (int j = i * i; j <= n; j += i) { isPrime[j] = false; } } } for (int i = 2; i <= n; i++) { if (isPrime[i]) { count++; } } return count; } }
내가 볼때 정말 놀라운 코드였다. 이 코드도 에라토스테네스의 체를 사용한 코드라고 한다. 공부해야지 🤓
뜯어보기
1. 사용할 변수 생성 & 초기화
- 길이가 n+1인 boolean 타입의 배열 isPrime을 만듦 -> 배열의 인덱스와 소수인지 판별할 숫자를 알아보기 쉽게 1:1로 매칭하기 위함
- isPrime 배열을 true로 초기화함 ( 기본값 false임 )
- 소수를 카운팅 할 변수 : count
boolean[] isPrime = new boolean[n + 1]; Arrays.fill(isPrime, true); int count = 0;
2. 2부터 i * i가 n보다 작을 때 까지 반복문 실행
반복할 내용 : 소수인지 확인해서 isPrime 배열에 반영
-> 소수가 아니면 false 처리 -> 소수가 아닌 조건 = 소수*소수 소수*소수 + 소수 소수*소수 + 소수 ...
for (int i = 2; i * i < n; i++) { if (isPrime[i]) { for (int j = i * i; j <= n; j += i) { isPrime[j] = false; } } }
🔻이해가 잘 안가서 진행해보았습니다 🤔
3. 소수 개수 셈 : 2 ~ n까지 true인 값 카운팅
for (int i = 2; i <= n; i++) { if (isPrime[i]) { count++; } }
🔻이해가 잘 안가서 진행해보았습니다2 🤔
느낀점
나는 인덱스의 활용을 잘 못하는 것 같다. 🤔
처음 풀어본 날 : 23.03.24 다시 풀어본 날 : 23.03.25 ~ 28
'코딩테스트 문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 : 이상한 문자 만들기 (0) 2023.11.22 프로그래머스 : 폰켓몬 (0) 2023.11.21 프로그래머스 : 문자열 내 p와 y의 개수 (0) 2023.11.21 프로그래머스 : 성격 유형 검사하기 (0) 2023.11.21 프로그래머스 : K번째 수 (0) 2023.11.21