문제 설명
양의 정수 n이 주어진다.이 번호 k진법으로 변환할 때 변환된 숫자 중 다음 조건을 만족하는 소수가 몇 개인지 알고 싶습니다.
- 0P0과 같이 소수점 양쪽에 0이 있는 경우
- 소수의 우변에 0만 있고 좌변에는 없는 경우(예: P0)
- 0P와 같이 소수점 왼쪽에 0이 하나만 있고 오른쪽에는 하나도 없는 경우.
- P와 같이 소수의 어느 쪽도 아닌 경우
- 단계, P는 각 자리에 0이 없는 십진수입니다.
- 예를 들어 101은 P가 될 수 없습니다.
예를 들어 437674를 삼항으로 변환하려면 211020101011입니다. 여기서 찾을 수 있는 소수는 211, 2, 11로 왼쪽부터 총 3개입니다. (211, 2, 11 참조 211은 k진법이 아닌 10진수로 볼 때 소수여야 합니다. ) P0 표에서 찾을 수 있습니다. 2는 0P0에서 11은 0P에서 찾을 수 있습니다.
자연 그리고 k는 인수로 제공됩니다. 아니요 k진법으로 환산했을 때 환산된 수에서 찾은 수 위의 조건을 만족하는 소수solve 함수에서 반환된 숫자를 완성하십시오.
한계
- 1≤ 아니요 ≤ 1,000,000
- 3≤ 케이 ≤ 10
입력 및 출력 예
| 아니요 | 케이 | 결과 |
| 437674 | 삼 | 삼 |
| 110011 | 10 | 2 |
기본적인 변환이 어려운 경우가 많아 관심도 가지지 않는 문제지만, 그래도 할 줄 알아야 하니까 해봐야겠다는 마음가짐으로 시작합니다.
꼬박 이틀 동안 친구와 함께 해결했습니다. 하루종일 투자한건 아니고 여유시간을 합쳐 문제를 생각해보면 5시간은 걸린것 같아요.
친구가 기본적인 전환에 많은 도움을 주었습니다. 혼자 공부를 더 해야겠습니다.
처음에는 하나의 함수만 만들어서 사용하려고 했으나 자꾸 답이 이상하게 나와서 결국 다른 함수를 만들어서 사용하게 되었습니다.
def prime_num_find(pn):
#쪼갠걸 정수로 변경해서 2부터 int(sol2(i))이거전까지 나눠서 나눠지는게 없으면 +1
#print(i)
if pn == 1: # "" 와 1 건너뛰기
return False # 위의 조건 만족하면 이후 코드 진행
for j in range(2, int(pn**(0.5)) + 1):
if pn % j == 0: # i가 나누어지면 소수가 아닌것
return False
return True
# 위의 문을 모두 충족시키지 않는 수(소수)는 count 함
이것이 “소수 결정” 기능입니다.
내 솔루션
def solution(n, k):
answer = -1
rev_base=""
count = 0
# k진수로 변경
while n > 0:
n, mod = divmod(n, k)
rev_base += str(mod)
sol = rev_base(::-1)
# 역순인 진수를 뒤집어 줘야 원래 변환 하고자하는 base가 출력
# 0으로 쪼개기
sol2 = sol.split('0')
sol2 = list(filter(lambda x: x != '', sol2))
sol2 = list(map(int, sol2))
#print(sol2)
for a in sol2:
if prime_num_find(a):
count += 1
return count
def prime_num_find(pn):
#쪼갠걸 정수로 변경해서 2부터 int(sol2(i))이거전까지 나눠서 나눠지는게 없으면 +1
#print(i)
if pn == 1: # "" 와 1 건너뛰기
return False # 위의 조건 만족하면 이후 코드 진행
for j in range(2, int(pn**(0.5)) + 1):
if pn % j == 0: # i가 나누어지면 소수가 아닌것
return False
return True
# 위의 문을 모두 충족시키지 않는 수(소수)는 count 함
# if True:
# count += 1
드디어 이 코드가 나왔습니다.
초기의
sol2 = list(filter(lambda x: x != '', sol2))
for 문으로 이 코드를 처리하려고 했지만 결과는 항상 이상합니다. 그래서 파이썬 내장 함수를 검색해서 사용했습니다.
이 정도는 친구랑 풀었는데…혼자 했다면 풀지 못했을 것 같고, 더 오래 걸렸을 것 같아요.
항상 질문을 할 때마다 이런 생각이 들지만 정말 현실적으로 배워야 합니다.