일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 구조체배열
- 카카오 코테
- spring boot
- 파이썬
- C언어
- TypeORM
- python
- Spring
- nestjs auth
- git
- 카카오 알고리즘
- 알고리즘
- AWS
- 카카오
- OpenCV
- 시스템호출
- nestJS
- Nodejs
- @Component
- 프로그래머스
- thymeleaf
- C++
- 가상면접사례로배우는대규모시스템설계기초
- 코테
- 스프링
- @Autowired
- 해시
- 컴포넌트스캔
- 코딩테스트
- nestjs typeorm
Archives
- Today
- Total
공부 기록장 💻
[알고리즘] K진수에서 소수 개수 구하기 (프로그래머스 2022 Kakao Blind Recruitment) 본문
# CS Study/Algorithms
[알고리즘] K진수에서 소수 개수 구하기 (프로그래머스 2022 Kakao Blind Recruitment)
dream_for 2022. 9. 22. 15:13K진수에서 소수 개수 구하기 (2022 K.B.R)
문제 설명
양의 정수 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
반응형
'# CS Study > Algorithms' 카테고리의 다른 글
[알고리즘] 튜플 (프로그래머스 2019 Kakao Winter Internship) (0) | 2022.09.25 |
---|---|
[알고리즘] 주차 요금 계산 (프로그래머스 2022 Kakao Blind Recruitment) (1) | 2022.09.22 |
[알고리즘] 수식 최대화 (프로그래머스 2020 Kakao Internship) (0) | 2022.09.20 |
[알고리즘] 캐시 (프로그래머스 2018 Kakao Blind Recruitment) (0) | 2022.09.19 |
[알고리즘/해시] 위장 (프로그래머스 해시 level 2) (1) | 2022.09.19 |
Comments