코딩 테스트/프로그래머스

[Python] 프로그래머스 lv.1 소수 찾기

위시리 2024. 12. 13. 21:12

 

문제 분석

  • 한자리 숫자가 적힌 종이 조각이 있다.
  • 종이 조각을 붙여 만들 수 있는 소수의 개수 return

 

코드 설계

  • 순서 있고, 중복x
  • 순열
  • 데이터의 갯수만큼 모든 순열 조합을 찾고
  • 그 중 소수인 수 구하기
  • 모든 숫자 조합 찾기
from itertools import permutations

arr = [1,2,3]
for r in range(1, len(arr)+1):
    for i in permutations(arr, r) :
        num = ''
        for j in i :
            num += str(j)
        print(int(num))
        
        
# result
1
2
3
12
13
21
23
31
32
123
132
213
231
312
321

 

정답 코드

1차 코드 - 실패 : 기대값과 출력값이 다름

from itertools import permutations

def isPrime(n) :
    if n < 2: 
        return False
    for i in range(2, n//2+1):
        if n % i == 0 :
            return False
    return True

def solution(numbers):
    answer = 0
    num_arr = []

    # 종이 조각 문자열을 배열로 바꾸고
    for n in numbers :
        num_arr.append(n)

    # 가능한 모든 숫자 찾고
    for r in range(1, len(num_arr)+1):
        for i in permutations(num_arr, r) :
            num = ''
            for j in i :
                num += str(j)
            if isPrime(int(num)) : # 소수이면
                answer += 1
    return answer

n = "011"
print(solution(n))

중복 검사를 안함

 

2차 코드

from itertools import permutations

def isPrime(n) : # 뭔가 더 효율적으로 쓸 수 있을거같은데
    if n < 2: 
        return False
    for i in range(2, n//2+1):
        if n % i == 0 :
            return False
    return True

def solution(numbers):
    answer = 0
    num_arr = []

    # 종이 조각 문자열을 배열로 바꾸고
    for n in numbers :
        num_arr.append(n)

    # 가능한 모든 숫자 찾고
    before = []
    for r in range(1, len(num_arr)+1):
        for i in permutations(num_arr, r) :
            num = ''
            for j in i :
                num += str(j)
            if int(num) in before : # 중복 체크
                continue
            before.append(int(num))
            if isPrime(int(num)) : # 소수이면
                answer += 1
    return answer

 

다른 사람 코드 1

from itertools import permutations

def solution(n):
    a = set()
    for i in range(len(n)):
        a |= set(map(int, map("".join, permutations(list(n), i + 1))))
    a -= set(range(0, 2))
    for i in range(2, int(max(a) ** 0.5) + 1):
        a -= set(range(i * 2, max(a) + 1, i))
    return len(a)

 

다른 사람 코드 2 - 재귀

primeSet = set()

def isPrime(number):
    if number in (0, 1):
        return False
    for i in range(2, number):
        if number % i == 0:
            return False

    return True


def makeCombinations(str1, str2):
    if str1 != "":
        if isPrime(int(str1)):
            primeSet.add(int(str1))

    for i in range(len(str2)):
        makeCombinations(str1 + str2[i], str2[:i] + str2[i + 1:])


def solution(numbers):
    makeCombinations("", numbers)

    answer = len(primeSet)

    return answer