실력을 쌓아 알고리즘 문제를 풀려는 계획을 가지고 있었는데, GoodGid님께서 팩폭을 해주셔서 그 분의 커리큘럼을 따라가는 중입니다. 그래서 프로그래머스의 leve1,2 수준의 문제를 먼저 풀고 나태 지옥에 빠지지 않기 위해 푼 문제를 포스팅 할 계획입니다.

level1을 못풀면 코딩 접어야 한다고 했는데, 다행히도 접을 정도는 아닌가봅니다.

소수의합

어려울 줄 알았지만, 생각보다 간단한 문제입니다. N이 주어지면 2부터 N까지의 소수의 합을 구하면 됩니다. 소수의 대한 간단한 정의는 다음과 같습니다.

1과 자기 자신으로만 나누어 떨어지는 수

이에 반대로 1과 자기 자신이 아닌 수로 나누어 떨어지면 소수가 아니라는 생각을 했고 이를 아래와 같이 구현했습니다.

  • 이미 나누어 떨어짐에도 불구하고 for문을 돌면서 나머지를 계속 검사하기 때문에 break 추가해서 문제 해결!
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
32
33
34
35
36
import java.io.*;

public class ex1 {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

int N = Integer.parseInt(bf.readLine());
int total = 0; // 소수의 합
Boolean isPrime = false;

for(int i=2;i<=N;i++){
isPrime = true;

for(int j=2;j<i;j++) {
// 이 부분은 입력받은 수가 1과 자기 자신을 제외한 수로 나누는 과정
// 이 과정에서 나누어 떨어진다는 것은 소수가 아닌 배수임을 의미
// 그렇기 때문에 한번 들어오면 어차피 소수가 아님으로 낭비를 줄이고자
// break문으로 빠져나옴.
if (i % j == 0) {
isPrime = false;
break;
}

}

if(isPrime == true)
total += i;

}

bw.write(total+"");
bw.flush();
bw.close();
}
}

에라토스테네스의체