알고리즘

[프로그래머스 lv 2] 소수찾기.py

파뱁 2022. 2. 16. 23:04
728x90

<문제 설명>

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

 

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

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

programmers.co.kr

한자리 숫자가 적힌 종이 조각을 붙여 몇 개의 소수를 만들 수 있는지 찾는 문제이다.

0부터 9까지의 숫자가 적힌 조각이 있으며, 숫자는 중복 될 수 있다.

11과 011은 같은 숫자 취급을 한다는 것을 유의하면서 문제를 해결하면 된다.

 

입출력의 예는 다음과 같다.

numbers return
"17" 3
"011" 2

 

<문제 풀이 아이디어>

우선 소수를 판별하는 함수를 따로 isPrime()으로 정의한다.

이후 permutations 라이브러리를 이용해 주어진 number 값의 순열값들을 리스트(result)에 extend로 저장한다.

이 값을 int(''.join(i)) 문을 통해 정수로 변환하는 작업을 거치면서 011같은 값을 11로 변환한다.

마지막으로 result의 리스트를 set()을 통해 중복을 제거한 후, 소수 판별 함수에 하나씩 넣으면서 소수인지 판별하고,

최종적으로 소수가 몇 개인지 리턴한다.

 

<문제 풀이 코드>

import math
from itertools import permutations
def solution(numbers):
    answer = 0
    p = []
    result = []
    
    for i in range(1, len(numbers)+1):
        p.extend(permutations(numbers, i)) #permutations 순열
        result = [int(''.join(i)) for i in p]
        #int(''.join(i)) 정수 변환 부분, 011 -> 11
    
    for i in set(result):
        if isPrime(i):
            answer+=1

    return answer

# 소수 판별 함수
def isPrime(n):
    if n < 2:
        return False
    
    for i in range(2, n//2+1):
        if n%i == 0:
            return False
        
    return True

채점 결과

728x90
반응형