[Programmers] - 소수 찾기

오동훈·2021년 7월 30일
0

Programmers

목록 보기
49/64
post-thumbnail

1. Problem 📃

📚 출처 - 프로그래머스

문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

입출력 예

numbersreturn
"17"3
"011"2

입출력 예 설명

예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.

예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.

  • 11과 011은 같은 숫자로 취급합니다.

2. Logic 👨‍🏫

  1. 모든 경우의 수를 만들어주고
  2. 중복 제거하고
  3. 소수 찾기

3. Code 💻

1. 내가 푼 코드

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

4. Feedback 📚

1. 순열 vs 조합

이 문제를 접했을 때 모든 경우의 수를 나열하고 싶었는데 문득 순열, 조합 단어가 떠올라 찾아봤는데 이 개념이 맞았다.
그래서 확실히 해두고자 정리하려구 한당😊

1. 순열

순열은 순서대로 뽑는 것을 의미하며 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')]

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을 가지고 각각 조합과 순열을 표현해 본 코드입니다.

2. 중복 제거하기

중복을 제거하는데에는 크게 두가지 방법이 있습니다.

  1. set(집합) 자료형을 이용하는 방법
  2. for문을 이용해 리스트 요소를 순회하며 중복 여부를 체크하는 방법

1. set을 이용한 중복 제거 방법

집합 자료형은 크게 두가지 특징이 있다.

  • 중복을 허용하지 않는다.
  • 순서가 없다.
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의 방법으로 중복을 제거할 경우, 순서가 뒤죽박죽 섞이게 된다는 단점이 있다.
반드시 순서를 지켜야 하는 경우, 반복문을 사용하면 된다.

2. for문을 이용한 중복 제거 방법

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']

3. 리스트 자료형 변환하기

리스트 자료형 변환하는데에는 아래와 같이 크게 두가지 방법이 있다.

1. map 함수

originalList = ['2', '4', '6', '8', '10', '12']
intList = list(map(int, originalList))
print(intList)

>>> 출력 결과: [2, 4, 6, 8, 10, 12]

2. List Comprehension

originalList = ['2', '4', '6', '8', '10', '12']
intList = [int(x) for x in originalList]
print(intList)

>>> 출력 결과: [2, 4, 6, 8, 10, 12]
profile
삽질의 기록들🐥

0개의 댓글