소수 찾기 (Programmers 42839)

문파이더맨·2021년 5월 5일
0

Algorithm

목록 보기
12/58
post-thumbnail

🧑‍💻 문제

한자리 숫자가 적힌 종이 조각이 흩어져있습니다.
흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

제한 사항

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

입출력 예 설명

  • 예제 #1
    [1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
  • 예제 #2
    [0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
  • 11과 011은 같은 수로 취급합니다.

🧑‍💻 해결방법

  • 입력받은 numbers를 리스트로 재생성한다.
  • 1개의 조합부터 생성된 리스트의 길이만큼의 조합이 나타날 수 있기 때문에 반복문을 통해 돌려준다.
  • permutations 함수를 사용해서 각 조합별로 쭉 나열해주고 소를 판별해서 answer로 count 한다.

🧑‍💻 코드

from itertools import permutations
import math

# 아래 함수보다 효율적인 함수
def is_prime(num):
	# 제곱근까지 확인하면서 미리 값을 쳐낼 수 있다.
    for i in range(2, int(math.sqrt(num)) + 1):
        if num % i == 0:
            return False
    return True


def is_prime_2(num):
    for i in range(2, num):
        if num % i == 0:
            return False
    return True


def solution(numbers):
    sep = [r for r in numbers]
    total = []
    answer = 0

    for i in range(1, len(sep) + 1):
        # 순열들을 total 리스트에 나열해주기
        total.append(list(map(''.join, permutations(sep, i))))

    # 2차원 리스트 이어붙여주고, 모두 int 형으로 형 변환
    q = list(map(int, sum(total, [])))
    # 중복 제거
    q = list(set(q))
    for i in q:
        if is_prime(i) == True:
            answer += 1
    return answer

🧑‍💻 총평

  • 새로배운 permutations 함수와 sum의 새로운 사용방법이 있다.
  • permutations를 제외하고는 기존에 알던 함수를 사용하는 거라 효율적으로 짤 수 있었다.
  • 내가 짰던 코드 중에 가장 파이썬스럽게 생각하고 부드럽게 생각해서 기분이 좋지 않을 수가 없다!
  • 이전같으면 count 변수 따로 만들고 answer에 넣어줬을텐데 programmers에 익숙해진 탓인지 그러한 불필요한 과정도 줄일 수 있다.
  • 처음 만든 리스트도 사실상 numbers = list(numbers)로 할 수 있다.
profile
Sever 개발할래요.

0개의 댓글