728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/92335
코딩테스트 연습 - k진수에서 소수 개수 구하기
문제 설명 양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0처럼 소수 양쪽에 0이 있는 경우 P0처럼 소
programmers.co.kr


풀이
- 이 문제는 우선 주어진 숫자n을 k진수로 바꿔야 한다.
- 그래서 n을 k로 나눈 나머지를 temp에 문자로 저장하여 n을 k진수로 바꾼 값을 구했다.
- 이때 위의 방식대로 저장하면 k진수의 역수로 저장되기 때문에 12번째 줄과 같이 문자열을 뒤집어준다.
- 문제의 조건을 보면 소수를 판별할 수를 뽑을 때, 0이 껴있지 않아야 한다.
- 그래서 문자열을 '0'으로 나눈 값을 arr배열에 저장했다. 만약 k진수로 바꾼 수에 0이 연속해서 나오면 arr배열에 ''과 같이 빈공간도 저장된다.
- 빈공간을 없앨 때, 1은 소수가 아니기 때문에 빈공간과 1이 아닐 때 수를 int형으로 바꿔 arr2에 저장한다.
- 이제 arr2에 담긴 숫자를 소수인지 아닌지 판별하여 answer배열에 담았다.
- 여기서 for문의 범위가 math.sqrt(i)+1인 이유는 i의 제곱근 까지만 확인하면 소수인지 알 수 있기 때문이다.
- 예를 들면 i가 16일때, 약수는 [1,2,4,8,16]이 된다. 약수를 보면 i의 제곱근인 4를 기준으로 대칭인 것을 확인할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import math
def solution(n, k):
answer = []
temp = ''
#n을 k진수로 바꾸기 위한 while문
while n > 0:
temp += str(n % k)
n //= k
#위의 방식으로 k진수를 구하면 반대로 구해져서 문자열을 뒤집어줌
temp = temp[::-1]
#소수를 구할 때, 0이 껴있으면 안되므로 0으로 문자열을 잘라줌
arr = list(temp.split('0'))
arr2 = []
for i in arr:
#만약 0이 연속해서 나오면 ''과 같은 빈공간이 저장될 수 있으므로
#빈공간과 소수가 아닌 1은 제외하고 arr2배열에 int형으로 저장
if i != '' and i != '1':
arr2.append(int(i))
#저장된 숫자의 소수 판별
for i in arr2:
check = True
for j in range(2, int(math.sqrt(i)) + 1):
if i % j == 0:
check = False
break
if check:
answer.append(i)
return len(answer)
|
cs |
728x90
반응형
'Python3 > 프로그래머스' 카테고리의 다른 글
2022.03.01 [프로그래머스] (python 파이썬) 파괴되지 않은 건물 (0) | 2022.03.01 |
---|---|
2022.02.28 [프로그래머스] (python 파이썬) 프린터 (0) | 2022.02.28 |
2022.02.28 [프로그래머스] (python 파이썬) 양궁대회 (0) | 2022.02.28 |
2022.02.27 [프로그래머스] (python 파이썬) 주차 요금 계산 (0) | 2022.02.27 |
2022.02.27 [프로그래머스] (python 파이썬) 신고 결과 받기 (0) | 2022.02.27 |
댓글