코딩하는 문과생

[알고리즘 풀이][python] 프로그래머스 LV2, '소수 찾기' 본문

프로그래밍/알고리즘 풀이

[알고리즘 풀이][python] 프로그래머스 LV2, '소수 찾기'

코딩하는 문과생 2019. 11. 18. 17:38

<문제 설명>

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

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

제한사항

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

<나의 풀이>

import itertools

def solution(numbers):
    n=len(numbers)
    temp_list1=[]
    temp_list2=[]
    # result=[]
    for i in range(1, n+1):
        my_p = itertools.permutations(numbers,i)
        for p in my_p:
            temp_list1.append(p)

    for i in temp_list1:
        x = ('').join(i)
        temp_list2.append(int(x))

    temp_list2=list(set(temp_list2))
    temp_list2.sort()

    count = 0
    for i in temp_list2:
        if i < 2:
            pass
        elif i == 2:
            count += 1
            # result.append(i)
        else:
            for j in range(2, i):
                if i % j == 0:
                    break
                elif j ==i-1:
                    count += 1
                    # result.append(i)

    return count

1. 파이썬에서 itertools 내장 모듈로 순열기능을 제공한다.

2. i = ('1', '3', '4') 튜플을 ('').join(i)를 이용해 '134'로 바꿀 수 있다.

3. 소수 찾기 문제 잘 기억해 두자

 

<다른사람 풀이>

from itertools import permutations
def solution(n):
    # a라는 집합을 선언
    a = set()

    # list나 set은 매개변수로 map()를 줄 수 있다.
    # ex. x = ['1','2','3']
    # x = set(map(int, x))
    for i in range(len(n)):
        a |= set(map(int, map("".join, permutations(list(n), i + 1))))

    # a에는 부분집합들이 담겨있다.
    # 소수가 아닌 0-1은 제외
    a -= set(range(0, 2))
    
    print(a)
    # {32, 2, 3, 321, 132, 231, 12, 13, 21, 213, 23, 312, 123, 31}

    # 소수 구하는 식
    for i in range(2, int(max(a) ** 0.5) + 1):
        a -= set(range(i * 2, max(a) + 1, i))
    return len(a)


print(solution("123"))