
🔍문제
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
| nubmers | return |
| "17" | 3 |
| "011" | 2 |
입출력 예 설명
예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
- 11과 011은 같은 숫자로 취급합니다.
💡 풀이 과정
- 문자열을 리스트 각각 잘라서 넣는다
- 모든 숫자 조합을 만든다 → permutation 이용
- 순열을 숫자로 저장한다
- 숫자를 소수인지 확인하고 소수라면 answer 배열에 넣는다
from itertools import permutations
import math
def solution(numbers):
answer = set()
num = list(numbers)
temp = []
for i in range(1, len(num)+1):
temp += list(permutations(num, i))
number_list = [int(''.join(j)) for j in temp]
for i in number_list:
if i == 0 or i == 1:
continue
else:
for j in range(2, i):
if i % j == 0:
continue
else:
answer.add(i)
return len(answer)

🚨 잘못된 소수 판별
continue와 else의 사용이 잘못되어 소수가 아닌 경우도 answer에 추가할 수 있다.
소수인지 판별하는 불리안 변수를 선언하여 코드를 수정하였다.
for i in number_list:
if i == 0 or i == 1:
continue
is_prime = True
for j in range(2, i):
if i % j == 0:
is_prime = False
break
if is_prime == True:
answer.add(i)
🌟 중간 코드
from itertools import permutations
import math
def solution(numbers):
answer = set()
num = list(numbers)
temp = []
for i in range(1, len(num)+1):
temp += list(permutations(num, i))
number_list = [int(''.join(j)) for j in temp]
for i in number_list:
if i == 0 or i == 1:
continue
is_prime = True
for j in range(2, i):
if i % j == 0:
is_prime = False
break
if is_prime == True:
answer.add(i)
return len(answer)

🐾 코드 리팩토링
소수 판별을 제곱근까지만 해도 괜찮다는 것을 발견하였다.
for j in range(2, int(math.sqrt(num)+1))

지난 코드와 비교해봤을 때, 시간이 줄어든 것을 확인할 수 있었다.
🌟 최종 코드
from itertools import permutations
import math
def solution(numbers):
answer = set()
num = list(numbers)
temp = []
for i in range(1, len(num)+1):
temp += list(permutations(num, i))
number_list = [int(''.join(j)) for j in temp]
for i in number_list:
if i < 2 :
continue
is_prime = True
for j in range(2, int(math.sqrt(i)+1)):
if i % j == 0:
is_prime = False
break
if is_prime:
answer.add(i)
return len(answer)'Python > 코딩 테스트' 카테고리의 다른 글
| [동적계획법] N으로 표현 (0) | 2024.11.08 |
|---|---|
| [백준] 15829번: Hashing (1) | 2024.11.07 |
| [백준] 10162번: 전자레인지 (1) | 2024.09.15 |
| [프로그래머스 - 스택/큐] 다리를 지나는 트럭 (1) | 2024.09.10 |
| [프로그래머스 - 스택/큐] 올바른 괄호 (1) | 2024.09.10 |
댓글