반응형
문제주소 :programmers.co.kr/learn/courses/30/lessons/42839
<문제 설명>
더보기
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
numbers return17 | 3 |
011 | 2 |
입출력 예 설명
예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
- 11과 011은 같은 숫자로 취급합니다.
<풀이법>
▒ 한줄 개념: 소수 계산▒
- numbers는 문자열이므로 각 숫자를 떼어내줍니다.
- "17" -> ["1", "7"]
- 분리된 숫자들을 permutations()를 이용해 순열 조합해줍니다.
- ["1", "7", "2"] -> ("1"), ("7"), ("1","7"), ("7", "1")
- 해당 숫자들을 "".join을 이용해 각각 하나의 숫자로 만들어줍니다.
- ("1"), ("7"), ("1","7"), ("7", "1") -> [1, 7, 17, 71]
- 각 숫자에 대하여 소수인지 판별합니다.
- 17은 소수인가? 17의 제곱근까지 나눠보며 어떤 수에도 나누어 떨어지지 않으면 소수!
- 17 -> [1, 2, 3,... 17^0.5]
- 반복문 작성시 제곱근 +1 까지로 반복해야 통과가 됩니다.
<코드(Python)>
from itertools import permutations
def solution(numbers):
answer = []
nums = [n for n in numbers] # numbers를 하나씩 자른 것
per = []
for i in range(1, len(numbers)+1): # numbers의 각 숫자들을 순열로 모든 경우 만들기
per += list(permutations(nums, i)) # i개씩 순열조합
new_nums = [int(("").join(p)) for p in per] # 각 순열조합을 하나의 int형 숫자로 변환
for n in new_nums: # 모든 int형 숫자에 대해 소수인지 판별
if n < 2: # 2보다 작은 1,0의 경우 소수 아님
continue
check = True
for i in range(2,int(n**0.5) + 1): # n의 제곱근 보다 작은 숫자까지만 나눗셈
if n % i == 0: # 하나라도 나눠떨어진다면 소수 아님!
check = False
break
if check:
answer.append(n) # 소수일경우 answer 배열에 추가
return len(set(answer)) # set을 통해 중복 제거 후 반환
더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest
반응형
'Programmers' 카테고리의 다른 글
[프로그래머스] 올바른 괄호 / Python (0) | 2021.01.19 |
---|---|
[프로그래머스] 튜플 / Python (0) | 2021.01.19 |
[프로그래머스] 문자열 압축 / Python (0) | 2021.01.19 |
[프로그래머스] 괄호 변환 / Python (0) | 2021.01.18 |
[프로그래머스] 조이스틱 / Python (0) | 2021.01.18 |