문제) k진수에서 소수 개수 구하기
코딩테스트 연습 - k진수에서 소수 개수 구하기
문제 설명 양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0처럼 소수 양쪽에 0이 있는 경우 P0처럼 소
programmers.co.kr
- 내 풀이 1 (첫 시도 : fail)
- for-else문 이용
- for문이 다 돌때까지 break가 되지 않으면 else문 실행
- divod( a, b ) : 정수를 나눈 몫과 나머지를 동시에 구할 때 사용하는 함수
- 10진수 → N진수 변환
- for-else문 이용
[Python] 2진수 / 8진수 / 16진수 / n진수 변환
2진수 / 8진수 / 16진수 표현 앞에 접두어를 붙여 구분한다 2진수 : 0b 8진수 : 0o 16진수 : 0x print(42==0b101010) #결과 True 숫자 10진수 → 2진수 / 8진수 / 16진수 변환 파이썬 내장함수 사용 접두어가..
yygs321.tistory.com
def change(n, q): #N진수 변환하는 코드
base = ''
while n > 0:
n, mod = divmod(n, q)
base += str(mod)
return base[::-1]
def solution(n, k):
number=change(n,k)
result=''
answer =0
for n in number:
if n=='0':
if result== None: #null이면
continue
for i in range(2,int(result)//2+1):
if int(result)%i==0:
result=''
break
else: #for문이 끝날때까지 break 되지 않으면
answer+=1
else:
result+=n
if result: #0P
for i in range(2,int(result)//2+1):
if int(result)%i==0:
break
else:
answer+=1
return answer

→ 실패 / 런타임 모두 존재
- 내 풀이 2
- 약수 확인하는 과정의 범위: 2 ~ int(int(result)**0.5)+1 로 변경
- k진수로 하나씩 변환하는 동시에 소수 판별
- deque을 이용해서 appendleft()로 변환값 역순 저장
- result='1' 일 때를 고려해야 함
from collections import deque
def solution(n, k):
answer =0
result=''
queue=deque()
while n > 0:
n, mod = divmod(n, k)
result=''.join(queue)
if mod==0:
if not result or result=='1': #null이면
queue.clear()
continue
for i in range(2,int(int(result)**0.5)+1):
if int(result)%i==0:
queue.clear()
break
else:
answer+=1
queue.clear()
else:
queue.appendleft(str(mod))
result=''.join(queue)
if result: #P로 끝나는 경우
for i in range(2,int(int(result)**0.5)+1):
if int(result)%i==0:
break
else:
answer+=1
return answer
print(solution(437674,3))
print(solution(110011,10))
#결과
3
2
- 다른 사람 풀이
- N진수 변환 함수 , 소수 판정 함수 따로 생성
- s.split('0')으로 0기준으로 숫자 나눠서 소수 판별
# n을 k진법으로 나타낸 문자열 반환
def conv(n, k):
s = ''
while n>0:
n, mod = divmod(n, k)
s+=str(mod)
return s[::-1]
# n이 소수인지 판정
def isprime(n):
if n <= 1: return False
for i in range(2,int(n**0.5+1)):
if n%i == 0: return False
return True
def solution(n, k):
s = conv(n,k)
cnt = 0
for num in s.split('0'):
if not num: continue # 빈 문자열에 대한 예외처리
if isprime(int(num)): cnt += 1
return cnt
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] [Level 2] [2018 KAKAO BLIND RECRUITMENT] n진수 게임 (0) | 2022.05.10 |
|---|---|
| [프로그래머스] [Level 2] 다음 큰 숫자 (0) | 2022.05.06 |
| [프로그래머스] [Level 2] 올바른 괄호 (0) | 2022.05.01 |
| [프로그래머스] [Level 2] [다이나믹 프로그래밍] 땅따먹기 (0) | 2022.04.30 |
| [프로그래머스] [Level 2] [완전 탐색] 카펫 (0) | 2022.04.27 |