문제
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입력 & 출력
입출력 예
numbersreturn
"17" | 3 |
---|---|
"011" | 2 |
새로 사용한 함수
permutations
몇 가지를 골라 순서를 고려해 나열한 경우 여기서 순서를 고려하는 특성이 있어서 여기서 사용하였다.
풀이과정
1. 소수를 판별하는 함수를 하나 만들도록 한다.
- 해당 함수 세부사항으로는 0과 1일 경우에는 소수가 아니므로 제외
- 제곱근을 이용한 범위 설정 대신 총수량의 반까지만 범위를 정하고 소수인지 검증
2. 1번의 함수를 만들어 놓은 상태에서 받은 숫자들을 이용해서 소수 판별을 해준 리스트를 만들도록 합니다. 그 시작은 순열입니다. permutations를 사용해서 순열을 만들어주는데 여기서 2개의 숫자가 들어왔다고 꼭 2개를 사용해서 만들지 않아도 되는 규칙이 있으므로 자신의 길이까지 모든 길이의 경우를 구하기 위해서 for문을 이용합니다.
3. 이렇게 만든 조합들은 join을 이용해서 붙여서 int형 변환하도록하며 해당 값을 check라는 배열에 저장하고 이것을 set 자료구조를 통해서 중복 제거합니다.
4. 3번까지 수행한 숫자들을 이용해서 소수인지 판별하여 최종 결과의 경우 수를 증가해주고 반환해주면 되겠습니다.
코드
from itertools import permutations
"""소수 판별 함수"""
def is_prime_number(num):
if num == 0 or num == 1:
return False
else:
for n in range(2, (num // 2) + 1): # math를 사용하지 않고 (num//2)+1 까지로 설정
if num % n == 0:
return False
return True
def solution(numbers):
# prime_set = set()
answer = 0
check = []
for i in range(len(numbers)):
numbers_permutation = permutations(list(numbers), i + 1)
result = list(map(int, map("".join, numbers_permutation)))
for ch in result:
check.append(ch)
print(set(check))
set_check = set(check)
for check in set_check:
if is_prime_number(check):
answer += 1
return answer
'Algorithm' 카테고리의 다른 글
[프로그래머스] 문자열 나누기 (0) | 2023.01.11 |
---|---|
[프로그래머스] 다항식 더하기 - 반쪽 리뷰 (0) | 2022.12.17 |
[프로그래머스] 구명보트 (0) | 2022.10.22 |
[프로그래머스] 평행 (0) | 2022.10.04 |
[프로그래머스] 점프와 순간 이동 (0) | 2022.09.27 |