반응형
문제
https://www.acmicpc.net/problem/17103
풀이
짝수 n을 두 소수의 합으로 나타낼 수 있는 경우의 수를 구해야하는 문제입니다.
또한 순서만 다른 것은 제외해야합니다. (3 + 7, 7 + 3)
그렇다면 먼저 소수인 수들을 구해주어야겠죠?
n이 최대 1,000,000 입니다.
1,000,000 이하의 소수들을 전부 구해줍시다.
그리고 이 소수들의 합으로 n을 나타낼 수 있다면 하나씩 세어주면 되지 않을까요?
...아닙니다...
1,000,000 이하의 소수의 개수는 70,000개 이상입니다.
70,000개라고 가정하고, 70,000개에서 2개를 뽑는 경우의 수만 해도 엄청 크겠네요...
시간제한이 0.5초기 때문에 시간초과가 날 것입니다.
그렇다면 어떻게 두 소수의 합이 n인지 판단할 수 있을까요..
10을 예시로 들어보겠습니다.
- 10 = 1 + 9 (1, 9 소수아님) X
- 10 = 2 + 8 (8 소수 아님) X
- 10 = 3 + 7 (둘 다 소수) O
- 10 = 4 + 6 (4, 6 소수아님)X
- 10 = 5 + 5 (둘 다 소수) O
... - 10 = 9 + 1 (9, 1 소수아님)X
감이 오시나요?
1부터 n까지 확인하면서, n = i + (n - i) 의 꼴입니다.
단순히 i와 (n - i)가 둘 다 소수이면 두 소수의 합이 n이 되겠네요!
여기서 하나더 추가하자면, 순서만 다른 것은 제외해주어야 합니다.
따라서 1부터 n이 아닌, 1부터 n / 2까지 확인해주면 됩니다.
소스코드
후기
맨 처음에는 소수들에서 2개를 뽑아서 합이 n이되면 count하는 방식으로 생각을 했었다가,
n이 1,000,000개 일때, 소수들이 너무 많아 다른 방법을 생각했던 문제입니다.
훨씬 빠른 시간내($O(n)$)에 동작하도록 구현할 수 있었습니다.
반응형
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 3009 네 번째 점 (Swift) (0) | 2023.03.16 |
---|---|
[BOJ] 백준 1085 직사각형에서 탈출 (Swift) (0) | 2023.03.16 |
[BOJ] 백준 4948 베르트랑 공준 (Swift) (0) | 2023.03.16 |
[BOJ] 백준 1929 소수 구하기 (Swift) (0) | 2023.03.16 |
[BOJ] 백준 4134 다음 소수 (Swift) (0) | 2023.03.16 |