Programmers

[프로그래머스] 소수 찾기 (Level 2) / Python

개발하는 사막여우 2021. 1. 19. 09:59
반응형

문제주소 :programmers.co.kr/learn/courses/30/lessons/42839

 

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

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

programmers.co.kr


<문제 설명>

더보기

문제 설명

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

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

제한사항

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

입출력 예

numbers                                                              return
17 3
011 2

입출력 예 설명

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

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

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

 

<풀이법>

▒ 한줄 개념: 소수 계산▒ 
  1. numbers는 문자열이므로 각 숫자를 떼어내줍니다.
    • "17" -> ["1", "7"]
  2. 분리된 숫자들을 permutations()를 이용해 순열 조합해줍니다.
    • ["1", "7", "2"] -> ("1"), ("7"), ("1","7"), ("7", "1")
  3. 해당 숫자들을 "".join을 이용해 각각 하나의 숫자로 만들어줍니다.
    • ("1"), ("7"), ("1","7"), ("7", "1") -> [1, 7, 17, 71]
  4. 각 숫자에 대하여 소수인지 판별합니다.
    • 17은 소수인가? 17의 제곱근까지 나눠보며 어떤 수에도 나누어 떨어지지 않으면 소수!
    • 17 -> [1, 2, 3,... 17^0.5]
    • 반복문 작성시 제곱근 +1 까지로 반복해야 통과가 됩니다.

 

<코드(Python)>

from itertools import permutations

def solution(numbers):
    answer = []                                   
    nums = [n for n in numbers]                   # numbers를 하나씩 자른 것
    per = []                                      
    for i in range(1, len(numbers)+1):            # numbers의 각 숫자들을 순열로 모든 경우 만들기
        per += list(permutations(nums, i))        # i개씩 순열조합
    new_nums = [int(("").join(p)) for p in per]   # 각 순열조합을 하나의 int형 숫자로 변환

    for n in new_nums:                            # 모든 int형 숫자에 대해 소수인지 판별
        if n < 2:                                 # 2보다 작은 1,0의 경우 소수 아님
            continue
        check = True            
        for i in range(2,int(n**0.5) + 1):        # n의 제곱근 보다 작은 숫자까지만 나눗셈
            if n % i == 0:                        # 하나라도 나눠떨어진다면 소수 아님!
                check = False
                break
        if check:
            answer.append(n)                      # 소수일경우 answer 배열에 추가

    return len(set(answer))                       # set을 통해 중복 제거 후 반환

 

 

더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest

 

 

반응형