코딩테스트/[PG] 문제 풀이

[프로그래머스] 완전 탐색 - 소수 찾기

_JAEJAE_ 2021. 7. 26. 23:53

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

 

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

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

programmers.co.kr


[사용한 함수]

- permutations : 순열을 구하는 함수

from itertools import permutations

permutations(iterable, r=None): r개로 이루어진 순열 반환하는 함수

                                          r에 None이나 빈칸으로 두면 iterable의 길이의 순열 생성

 

ex. arr = ['A', 'B', 'C']

    print(list(map(''.join, permutations(arr, 2))))

    결과 :  ['AB', 'AC', 'BA', 'BC', 'CA', 'CB'] 

 


[풀이 과정]

1. 주어진 numbers에서 나올 수 있는 순열의 길이는 1부터 len(numbers)까지 가능하기 때문에 반복문을 돌리면서 순열을 리스트로 만들어준다.

 

2. 중복된 값을 제외하기 위해 set함수로 만들어진 리스트를 묶어주고 각 값이 소수인지 check함수를 사용해 확인한다.

 

3. check함수

- 소수인지 확인하려는 값(val)이 1보다 작거나 같으면 소수가 아니므로 -1을 반환한다.

- 1보다 큰 값이라면 2부터 val-1까지 값으로 나누어 떨어지는지 확인한다.

   - 만약 나누어 떨어지면 소수가 아니므로 -1을 반환한다.

   - 나누어 떨어지는 수가 없다면 소수이므로 1을 반환한다.

 

4. check함수의 결과가 1이면 answer리스트에 추가한다.

 

5. answer에 겹치는 값이 있을수도 있으므로 len(set(answer))을 반환한다.


[소스 코드]

from itertools import permutations

def check(val):
    if val <= 1:
        return -1
    for n in range(2, val):
        if val % n == 0:
            return -1
    return 1

def solution(numbers):
    answer = []
    
    for i in range(len(numbers)):
        arr = list(map(int, map(''.join, permutations(numbers, i+1))))
        
        for j in set(arr):
            res = check(j)
            if res == 1:
                answer.append(j)
                
    return len(set(answer))