📚 출처 - 프로그래머스
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
입출력 예
numbers | return |
---|---|
"17" | 3 |
"011" | 2 |
입출력 예 설명
예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
- 모든 경우의 수를 만들어주고
- 중복 제거하고
- 소수 찾기
from itertools import combinations # 조합
from itertools import permutations # 순열
def primeNumber(num):
if num < 2:
return 0
for i in range(2, num//2+1):
if num % i == 0:
return 0
return 1
def solution(numbers):
answer = 0
perList = []
for i in range(1, len(numbers)+1):
perList += list(map(''.join, permutations(numbers, i)))
perList = [int(x) for x in perList]
perList = list(set(perList))
for i in perList:
answer += primeNumber(i)
return answer
이 문제를 접했을 때 모든 경우의 수를 나열하고 싶었는데 문득 순열, 조합 단어가 떠올라 찾아봤는데 이 개념이 맞았다.
그래서 확실히 해두고자 정리하려구 한당😊
순열은 순서대로 뽑는 것을 의미하며 nPr로 표기합니다. (n은 전체 갯수, r은 뽑는 갯수)
예를 들어, 012라는 숫자의 순열을 구한다고 가정한다면 아래와 같습니다.
0, 1, 2, 01, 02, 12, 10, 20, 21, 012, 021, 102, 120, 210, 201
# 3장의 카드 중 2장을 뽑는 경우의 수는 다음과 같다. (순서를 더함)
>>> import itertools
>>> list(itertools.permutations(['1', '2', '3'], 2))
[('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]
조합은 순열과 다르게 뽑아서 순서대로 나열하는 것이 아니라 뽑기만 하는 경우입니다.
예를 들어, 012라는 숫자의 조합을 구한다고 가정한다면 아래와 같습니다.
0, 1, 2, 01, 02, 12, 012
# 3장의 카드 중 2장을 뽑는 경우의 수는 다음과 같다. (순서 중복 X)
>>> import itertools
>>> list(itertools.combinations(['1', '2', '3'], 2))
[('1', '2'), ('1', '3'), ('2', '3')]
다음 아래의 사진은 011을 가지고 각각 조합과 순열을 표현해 본 코드입니다.
중복을 제거하는데에는 크게 두가지 방법이 있습니다.
집합 자료형은 크게 두가지 특징이 있다.
my_list = ['A', 'B', 'C', 'D', 'B', 'D', 'E']
my_set = set(my_list) #집합set으로 변환
my_list = list(my_set) #list로 변환
print(new_list)
>>> ['D', 'B', 'A', 'E', 'C']
set의 방법으로 중복을 제거할 경우, 순서가 뒤죽박죽 섞이게 된다는 단점이 있다.
반드시 순서를 지켜야 하는 경우, 반복문을 사용하면 된다.
my_list의 모든 요소를 체크하고, 그 항목이 new_list에 있는지 확인하고 만약 없다면 추가해주는 방식이다.
my_list = ['A', 'B', 'C', 'D', 'B', 'D', 'E']
new_list = []
for v in my_list:
if v not in new_list:
new_list.append(v)
print(new_list)
>>> ['A', 'B', 'C', 'D', 'E']
리스트 자료형 변환하는데에는 아래와 같이 크게 두가지 방법이 있다.
originalList = ['2', '4', '6', '8', '10', '12']
intList = list(map(int, originalList))
print(intList)
>>> 출력 결과: [2, 4, 6, 8, 10, 12]
originalList = ['2', '4', '6', '8', '10', '12']
intList = [int(x) for x in originalList]
print(intList)
>>> 출력 결과: [2, 4, 6, 8, 10, 12]