https://www.acmicpc.net/problem/2023
2023번: 신기한 소수
수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다. 7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수
www.acmicpc.net
문제를 처음 보면 딱 드는 생각이 에라토스테네스의 체이다. 소수는 구하는 문제로는 백준 1929번에서 에라토스테네스의 체를 활용하여 소수를 빠르게 구했었다.
이번 문제도 똑같이 완전탐색으로 for문을 돌리면서 가능한 모든 경우를 다 에라테스테네스의 체를 이용하여 걸러내려고 했지만 시간초과가 떴다.
조금만 생각해봐도 N = 8이면 숫자가 9천만개가 있는데 그걸다 계산하려하니 시간초과가 뜰 수밖에 없었다.
그래서 생각한건 재귀함수다. 앞자리 숫자부터 소수인 부분만 골라서 탐색하는 거다.
예를들어 N = 4라면 2는 소수이고 다음으로 1을 붙이고, 그럼 21은 소수가 아니므로 3을 붙이고, 23은 소수이므로 ....
쭉쭉 1,3,5,7,9 홀수만 뒤에 붙여서 소수를 판별하는 방법이다.
위와 같은 방법이면 N = 8이더라도 굳이 9천만개의 수를 다 구해볼 필요 없이 소수가 될거 같은 수만 에라토스테네스의 체로 걸러내므로 시간을 많이 줄일 수 있다.
코드는 다음과 같다.
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10000)
def Sol():
N = int(input())
def prime(num):
for i in range(2, int(num**(1/2))+1):
if num % i == 0:
return False
else:
return True
def dfs(n):
if len(str(n)) == N:
print(n)
else:
for i in range(1,10,2):
if prime(10 * n + i):
dfs(10 * n + i)
else:
pass
dfs(2);dfs(3);dfs(5);dfs(7)
if __name__ == "__main__":
Sol()

글이나 코드에 대한 질문, 조언 환영합니다
'📚알고리즘 > 백준' 카테고리의 다른 글
[백준 2178번] 미로 탐색 (Python/파이썬) (0) | 2023.02.18 |
---|---|
[백준 13023번] ABCDE (Python/파이썬) (0) | 2023.02.06 |
[백준 11724번] 연결 요소의 개수 (Python/파이썬) (0) | 2023.02.01 |
[백준 1377번] 버블 소트 (Python/파이썬) (0) | 2023.01.31 |
[백준 20442번] ㅋㅋ루ㅋㅋ (Python/파이썬) (0) | 2023.01.30 |
https://www.acmicpc.net/problem/2023
2023번: 신기한 소수
수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다. 7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수
www.acmicpc.net
문제를 처음 보면 딱 드는 생각이 에라토스테네스의 체이다. 소수는 구하는 문제로는 백준 1929번에서 에라토스테네스의 체를 활용하여 소수를 빠르게 구했었다.
이번 문제도 똑같이 완전탐색으로 for문을 돌리면서 가능한 모든 경우를 다 에라테스테네스의 체를 이용하여 걸러내려고 했지만 시간초과가 떴다.
조금만 생각해봐도 N = 8이면 숫자가 9천만개가 있는데 그걸다 계산하려하니 시간초과가 뜰 수밖에 없었다.
그래서 생각한건 재귀함수다. 앞자리 숫자부터 소수인 부분만 골라서 탐색하는 거다.
예를들어 N = 4라면 2는 소수이고 다음으로 1을 붙이고, 그럼 21은 소수가 아니므로 3을 붙이고, 23은 소수이므로 ....
쭉쭉 1,3,5,7,9 홀수만 뒤에 붙여서 소수를 판별하는 방법이다.
위와 같은 방법이면 N = 8이더라도 굳이 9천만개의 수를 다 구해볼 필요 없이 소수가 될거 같은 수만 에라토스테네스의 체로 걸러내므로 시간을 많이 줄일 수 있다.
코드는 다음과 같다.
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10000)
def Sol():
N = int(input())
def prime(num):
for i in range(2, int(num**(1/2))+1):
if num % i == 0:
return False
else:
return True
def dfs(n):
if len(str(n)) == N:
print(n)
else:
for i in range(1,10,2):
if prime(10 * n + i):
dfs(10 * n + i)
else:
pass
dfs(2);dfs(3);dfs(5);dfs(7)
if __name__ == "__main__":
Sol()

글이나 코드에 대한 질문, 조언 환영합니다
'📚알고리즘 > 백준' 카테고리의 다른 글
[백준 2178번] 미로 탐색 (Python/파이썬) (0) | 2023.02.18 |
---|---|
[백준 13023번] ABCDE (Python/파이썬) (0) | 2023.02.06 |
[백준 11724번] 연결 요소의 개수 (Python/파이썬) (0) | 2023.02.01 |
[백준 1377번] 버블 소트 (Python/파이썬) (0) | 2023.01.31 |
[백준 20442번] ㅋㅋ루ㅋㅋ (Python/파이썬) (0) | 2023.01.30 |