programming language/Algorithm

[완전탐색 simulating 예제] 프로그래머스 완전탐색 level2 소수찾기

jellylucy 2022. 3. 17. 20:44

문제

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

 

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

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

programmers.co.kr

 


문제 풀이

첫번째 난관

주어진 원소들로 만들 수 있는 정수들을 만드는 것이 문제였다.

이 때 permutations 함수를 이용했다.

from itertools import permutations

처음 사용하는 모듈이였는데, 알아야 하는 유용한 모듈이였다.

이 사이트를 이용해 사용했다.

https://blog.naver.com/hunii123/222322576767

result = list(map(''.join,permutations(numbers, i)))

for문 속에서 i를 늘려가며 만들 수 있는 순열길이를 늘렸다.

 

 

두번째 난관

011, 11을 같게 만들어야 한다. 즉, 중복을 제거해야한다.

 

이 때 set()을 이용했다. 집합의 메소드로 set()으로 묶으면 중복이 사라진다.

 

1. 소수 판별함수에 넣기전에, set() 함수를 이용해 중복을 없앴다.

2. 소수 판별함수에 넣을 때 int변환되어 들어가므로 그 것을 이용했다.

다시 말해 011, 11은 모두 11으로 들어가는 점을 이용했다.

나온 값을 곧바로 answer값에 append하여, answer 출력 전 set 함수를 이용해 중복을 없앴다.

        for j in list(set(result)):
            # print(j)
            if is_sosu(int(j)):
                answer.append(int(j))

 

from itertools import permutations

def is_sosu(num):
    if num < 2:
        return False
    for i in range(2,num):
        if num % i == 0:
            return False
    return True
    
def solution(numbers):
    all_per = []
    len_num = len(numbers)
    answer = []
    
    for i in range(1,len_num+1):
        result = list(map(''.join,permutations(numbers, i)))
        for j in list(set(result)):
            # print(j)
            if is_sosu(int(j)):
                answer.append(int(j))
                
    answer = set(answer)
    answer = len(answer)
    return answer

    # 순열 함수
    # set 함수 : 중복 원소 제거