알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://programmers.co.kr/learn/courses/30/lessons/12921
코딩테스트 연습 - 소수 찾기
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상
programmers.co.kr
Think🤔
class Solution {
public int solution(int n) {
int answer = 0;
for(int i=2; i<=n; i++){
int cham = 0;
for(int j=2; j<=i; j++){
if(i % j == 0){
cham++;
}
}
if(cham == 1){
answer++;
}
}
return answer;
}
}
계속해서 반복문을 두개 돌아서 숫자가 엄청 커졌을 때, 시간 초과가 뜬다.
1. 처음 방법, 전체를 돌리면서 전체 돌리는 숫자가 소수인지 판별하기 위해서 나눠서 1이상이면 소수라고 판별
==== > 해당방법 시간 초과
2. 두번째 방법으로 제곱근 까지만 반복문을 돌린다 어차피 자연수 n이 소수이기 위한 조건은 n의 제곱근 보다
작은 소수로도 나눠지지 않는 방법을 생각한다.
3. 세번째 방법 에라토스테네스의 체
전체 갯수가 120이면 2의 배수를 다지운다 3의 배수를 다 지운다 5의 배수를 다 지운다 7의 배수를 다 지우면
모든 소수의 배수를 다 지우기 때문에 이러면 남는 수는 소수밖에 없다.
Solution✍
import java.util.*;
class Solution {
public int solution(int n) {
int answer = 0;
for(int i=2; i<=n; i++){
int cham = 0;
for(int j=2; j<=Math.sqrt(i); j++){
if(i % j == 0){
cham++;
break;
}
}
if(cham == 0){
answer++;
}
}
return answer;
}
}
class Solution {
public int solution(int n) {
int answer = 0;
int[] arr = new int[n+1];
arr[0] = 0; arr[1] = 0;
// 각 자리 수를 배열에다가 저장시킴
for(int i=2; i<=n; i++){
arr[i] = i;
}
for(int i=2; i<=n; i++){
if(arr[i] == 0){ // 만약 0이면 건너뛴다.
continue;
}
//j는 자기 자신의 값을 더해서 배수를 빼준다
for(int j=2*i; j<=n; j=j+i){
arr[j] = 0;
}
}
// 반복문을 이용해서 0이 아닌 값을 찾는다.
for(int i=0; i<=n; i++){
if(arr[i] != 0){
answer++;
}
}
return answer;
}
}
Review🤩
배열을 이용해서 새롭게 풀 수 있었다.
'Algorithm' 카테고리의 다른 글
[프로그래머스] SQL 1LEVEL 문제 모음 (0) | 2022.02.11 |
---|---|
[프로그래머스] 시저 암호 (0) | 2022.02.04 |
[프로그래머스] 문자열 내 p와 y의 개수 (0) | 2022.02.04 |
[프로그래머스] 이상한 문자 만들기 (0) | 2022.02.04 |
[프로그래머스] 약수의 합 (0) | 2022.02.04 |