*문제 출처는 프로그래머스에 있습니다.
문제 제목: 소수 찾기 (2단계)
문제 사이트: https://programmers.co.kr/learn/courses/30/lessons/42839
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
"17" | 3 |
"011" | 2 |
예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
- 11과 011은 같은 숫자로 취급합니다.
나의 풀이
from itertools import permutations # 순열을 사용하기 위해 모듈 임포트
# 소수 판별 함수
def isPrime(x):
if x == 1 or x == 0:
return False
for i in range(2,x//2+1):
if x % i == 0: # 약수가 있는 경우 소수가 아님
return False
else:
return True
# 숫자 카드 조합하기
def solution(numbers):
arr = []
com_arr = []
cnt = 0
for i in numbers: #입력받은 숫자카드를 하나씩 원소로 저장한다.
arr.append(i)
for n in range(len(arr)):
for i in permutations(arr,n+1): # 순열 뽑기
com_arr.append(int("".join(i))) # 투플 값을 합쳐서 정수형으로 반환
com_arr = set(com_arr) # 같은 숫자 중복 제거
for i in com_arr:
if isPrime(int(i)) == True:
cnt += 1
return cnt
숫자 카드가 1개,2개 ... 등 N의 자리 숫자인 경우도 생각해서 입력받은 문자열의 길이만큼
for문을 넣어주었음
그 다음 permutations 함수를 이용해서 순열을 뽑아주었다.
itertools 라이브러리는 해당 게시글을 참조하길 바랍니다.
모범답안
비트연산자, join함수, itertools, 에라토스테네스의 체를 적절하게 이용한 풀이이다.
가능한 수를 a에 저장하고 에라토스테네스 체를 사용해서 a에서 제거하였다.
from itertools import permutations
def solution(n):
a = set()
for i in range(len(n)):
# <<, >>, |=, &= 는 비트 연산자이다.
a |= set(map(int, map("".join, permutations(list(n), i + 1))))
a -= set(range(0, 2)) #0과 1은 소수가 아니므로 a에서 제외한다.
# 에라토스테네스의 체
for i in range(2, int(max(a) ** 0.5) + 1):
a -= set(range(i * 2, max(a) + 1, i))
return len(a)
# 비트 연산자
& (Binary AND) : bit 단위로 and연산을 한다.
| (Binary OR) : bit 단위로 or연산을 한다.
^ (Binary XOR) : bit 단위로 xor연산을 한다.
~ (Binary NOT) : bit 단위로 not연산을 한다.(1의 보수)
<< (Binary left Shift) : bit 단위로 왼쪽으로 비트단위 밀기 연산을 한다.
>> (Binary right Shift) : bit 단위로 오른쪽으로 비트단위 밀기 연산을 한다.
※ 알아야 할 것
- 투플 값도 join() 함수를 이용하여 투플값을 문자열(혹은 정수형)로 나타낼 수 있다.
- 수들은 약수가 대칭적으로 나오기 때문에 n의 약수는 sqrt(n)까지만 찾는다.
'coding test - python > Programmers' 카테고리의 다른 글
Programmers / 주식 가격 / Python 파이썬 (0) | 2022.05.19 |
---|---|
Programmers / n^2 배열 자르기 / Python 파이썬 (0) | 2022.05.18 |
Programmers / 가장 큰 수 / Python 파이썬 (0) | 2022.05.13 |
Programmers / 숫자의 표현 / Python 파이썬 (0) | 2022.05.11 |
Programmers / 전화번호 목록 / Python 파이썬 (0) | 2022.05.11 |