[백준] 2023(파이썬) - 신기한 소수
resilient
·2021. 8. 11. 11:46
728x90
반응형
https://www.acmicpc.net/problem/2023
2023번: 신기한 소수
수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다. 7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수
www.acmicpc.net
- 이 문제는 먼저 소수를 판별해야 하기 때문에 에라토스테네스의 체로 소수인지 아닌지 확인하는 함수를 하나 만들었다.
- 그다음에 계속 삽질을 했던 부분인데, 나는 숫자를 하나씩 소수 판별을 해주기 위해 10으로 나눠 주고, 그 숫자들이 소수인지 아닌지를 확인했는데 이렇게 되면, 어떤 숫자들을 판별해줄 것인가?라는 생각을 하게 된다.
예시를 보면 4일 때 4자리 수 들 중 다음 조건과 같은 수들을 뽑아줘야 하는데 내가 처음 생각했던 방법을 생각하면 1000부터 9999까지 이게 조건에 맞는 수인지? 를 판별해주면 시간이 너무 오래 걸리기 때문이다. - 그래서 생각한 방법은 어차피 한자리 한자리 숫자가 다 소수여야하니까 소수에 10을 곱하고 0부터 9까지 더해서 숫자들을 추려 주는 방식을 사용했다. 그러면 시간 초과가 나지 않는다.
- 한 자리 숫자들 중 소수인건 2,3,5,7 밖에 없으니까 각각의 경우에서 10을 곱하고 0부터 9까지 더해준 뒤, 이 숫자가 소수인지 아닌지를 확인하고 소수일 때만 다시 10을 곱하고 0부터 9까지 더해주고... 이런 방식을 사용했다.
- 그럼 언제 return 값을 받냐? 숫자를 str로 문자열 처리를 해주면 몇 자리 수인지 확인할 수 있고 이 숫자가 입력값과 같을 때 return을 해주면 된다.
import sys
input = sys.stdin.readline
n = int(input())
def checkPrimeNum(check_number):
#에라토스테네스의 체로 소수인지 확인
for i in range(2, int(check_number**0.5)+1):
if int(check_number) % i == 0:
return False
return True
def dfs(num):
# 목표 길이 도달 시 멈춤
if len(str(num))==n:
print(num)
else:
for i in range(10):
temp = num * 10 + i
# 10곱하고 i 더해서 자릿수 늘린 수가 소수일때만
# dfs로 다음 자릿수 확인 넘김
if checkPrimeNum(temp) == True:
dfs(temp)
# 맨마지막으로 맨 앞자리를 봤을 떄 소수여야하므로
# 일의자리숫자중에 소수로 시작을 한다.
dfs(2)
dfs(3)
dfs(5)
dfs(7)
반응형
'자료구조 & 알고리즘 > 백준(Baekjoon)' 카테고리의 다른 글
[백준] 2251(파이썬) - 물통 (0) | 2021.08.14 |
---|---|
[백준] 2407(파이썬) - 조합 (0) | 2021.08.12 |
[백준] 10830(파이썬) - 행렬 제곱 (0) | 2021.08.10 |
[백준] 1062(파이썬) - 가르침 (0) | 2021.08.08 |
[백준] 11559(파이썬) - Puyo Puyo (0) | 2021.08.07 |