본문 바로가기
파이썬 코딩테스트/프로그래머스

프로그래머스 / 소수 찾기 / Python

by S.T.Lee 2021. 12. 21.

https://programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이

programmers.co.kr

 

이번 문제의 핵심은 itertools를 경험하는 것에 있다고 본다.

https://docs.python.org/ko/3.8/library/itertools.html

 

itertools — 효율적인 루핑을 위한 이터레이터를 만드는 함수 — Python 3.8.12 문서

 

docs.python.org

 

permutations()를 보면 "p[,r] / r-길이 튜플들, 모든 가능한 순서, 반복되는 요소 없음"이라 적혀있다.

즉, 모든 조합을 찾아야하는 문제 특성상 r을 1에서 문자열의 길이만큼 줘야하는 것이다.

이후, int로 바꾸고 중복을 제거해주면 된다.

from itertools import permutations

def solution(numbers):
    answer = 0
    all_list = []
    for j in range(1,len(numbers)+1):
        for i in permutations(numbers, j):
            all_list.append(int("".join(i))) #조합을 하나의 문자열로 합침
    
    all_list = set(all_list) #중복 제거
    
    for al in all_list:
        if al == 0 or al == 1: #0과 1이면 소수가 아니고
            pass
        elif al == 2: #사실 필요없는데
            answer += 1
        else:
            for num in range(2, al): #여기서 해결되는 건데 왜 저랬을까
                if al % num == 0:
                    break #나눠지면 else하단 for문 탈출
                if num == al-1: #맨마지막까지 왔으면 소수 확인
                    answer += 1
    
    return answer