관리 메뉴

공부 기록장 💻

[알고리즘] K진수에서 소수 개수 구하기 (프로그래머스 2022 Kakao Blind Recruitment) 본문

# CS Study/Algorithms

[알고리즘] K진수에서 소수 개수 구하기 (프로그래머스 2022 Kakao Blind Recruitment)

dream_for 2022. 9. 22. 15:13

K진수에서 소수 개수 구하기 (2022 K.B.R)

코딩테스트 연습 - k진수에서 소수 개수 구하기

문제 설명

양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다.

  • 0P0처럼 소수 양쪽에 0이 있는 경우
  • P0처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
  • 0P처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
  • P처럼 소수 양쪽에 아무것도 없는 경우
  • 단, P는 각 자릿수에 0을 포함하지 않는 소수입니다.
    • 예를 들어, 101은 P가 될 수 없습니다.

예를 들어, 437674을 3진수로 바꾸면 211020101011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이 있으며, 총 3개입니다. (211, 2, 11을 k진법으로 보았을 때가 아닌, 10진법으로 보았을 때 소수여야 한다는 점에 주의합니다.) 211은 P0 형태에서 찾을 수 있으며, 2는 0P0에서, 11은 0P에서 찾을 수 있습니다.

정수 n과 k가 매개변수로 주어집니다. n을 k진수로 바꿨을 때, 변환된 수 안에서 찾을 수 있는 위 조건에 맞는 소수의 개수를 return 하도록 solution 함수를 완성해 주세요.


제한사항

  • 1 ≤ n ≤ 1,000,000
  • 3 ≤ k ≤ 10

입출력 예

n k result

437674 3 3
110011 10 2

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

110011을 10진수로 바꾸면 110011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 11, 11 2개입니다. 이와 같이, 중복되는 소수를 발견하더라도 모두 따로 세어야 합니다.

 

 

💡나의 문제 풀이

문제 해결 아이디어

  • 먼저, n을 k진수 문자열로 변환한다.
    • 진수 변환 방법에 의해 n을 k로 나눈 나머지값을 이어붙인 문자열을 뒤집기
  • 변환한 문자열을 앞에서부터, 0을 마주할 때까지, 또는 문자열의 끝에 도달할 때까지 자르고 해당 수가 소수인지 확인한다.

고려사항

  • 소수 판별 시 효율적인 방법을 택해야 함

작성 코드

  • 테스트 1에서 시간 초과 발생
    • 소수 판단을 효율적으로 바꾸거나, 문자열을 자르는 과정을 간결하게 해야 할 듯
# n을 k진수 문자열로 변환
def changeTo(n, k):
    s = ''
    while n>0:
        s+=str(n%k)
        n=n//k
    return s[::-1]
  
# 소수 판단
def isPrime(n):
    if n==1 or n==0:
        return False
    for i in range(2, n):
        if n%i==0:
            return False
    return True

def solution(n, k):
    n = changeTo(n,k) # n을 k진수로 변환
    # 문자열을 앞에서부터 0을 만날때까지 자른 수가 소수인지 판단하기
    cnt = 0
    i = 0
    start=0
    while i<=len(n):
        if i==len(n) or n[i]=='0':
            end=i
            s = n[start:end]
            if s:
                if isPrime(int(s)) == True:
                    cnt+=1
                start=i+1
        i+=1
    return cnt

def test():
    print(solution(437674,3)==3)
    print(solution(110011, 10)==2)
    print(solution(11, 10)==1)
    print(solution(1,10)==0)
    print(solution(1011, 10)==1)
    print(solution(1000, 10)==0)

test()
  • 소수 판별을 위한 i 의 범위를 n 에서 n//2 로, sqrt(n) 으로 좁혔더니 모든 테스트를 통과
import math 

# def changeTo(n, k):
    
  
def isPrime(n):
    if n==1 or n==0:
        return False
    for i in range(2, int(math.sqrt(n))+1):
        if n%i==0:
            return False
    return True

 

답안 코드

  • 0 을 만난 경우를 처리하기 위해서 split('0') 함수를 사용했다.
 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
arraySplitedByZero = string.split('0')
    for item in arraySplitedByZero:
        if item == '':
            continue

리뷰

  • 문제를 충분히 이해하는데 까지 어려움이 있었던 것을 제외하고는 매우 쉬웠던 문제이다.
  • split() 함수를 이용해 0을 기준으로 문자열을 한번에 자르지 못한 부분이 아쉽다.
728x90
반응형
Comments