알고리즘/프로그래머스

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

cha_eyoon 2023. 12. 30. 13:59

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 접근 

 

우선 입력한 숫자로 이루어진 문자열 예를 들어 "1234"를 하나씩 분리해서 새로운 리스트를 만들어  ['1',  '2',  '3', ' 4']를 만들어야겠다고 생각했다. 그리고 이들을 반복문으로 돌면서 [1, 2, 3, 4, 12.. , 1234] 를 만들어 또 새로운 리스트로 만들면 되지 않을까 생각을 했다.  하지만 12와 21은 다르므로 순열로 생각하면 되지 않을까? 이전에 풀었을 때는 순열을 사용할 수 있는 라이브러리를 import 했던 기억이 있었는데 사실 순열을 안 쓰고 싶었지만 방법이 떠오르지가 않았다. 이번에도 결국 순열을 사용하는 방법을 검색했다.

 

코드
from itertools import permutations

# 소수 체크 함수
def isPrime(num):
    if num <= 1:
        return False
    for i in range(2, int(num**0.5) + 1):  # 2부터 num의 제곱근까지만 확인
        if num % i == 0:
            return False  # 나누어 떨어지면 소수가 아님
    return True  # 소수인 경우 True 반환

# 주어진 숫자를 이용하여 소수가 되는 경우의 개수를 반환하는 함수
def solution(numbers):
    numbers_list = list(numbers)
    total = []  # 모든 가능한 조합을 저장할 리스트
    final = []  # 조합을 정수로 변환하여 저장할 리스트
    answer = []  # 소수를 저장할 리스트
    
    # 주어진 숫자로 만들 수 있는 모든 조합을 total 리스트에 추가
    for i in range(1, len(numbers_list) + 1):
        total += list(map(''.join, permutations(numbers_list, i)))
    
    # 각 조합을 정수로 변환하여 final 리스트에 추가
    for i in total:
        final.append(int(i))
        
    # 중복 제거를 위해 set으로 변환
    answer_set = set(final)
    
    # 각 숫자가 소수인지 확인하여 answer 리스트에 추가
    for i in answer_set:
        if isPrime(i):
            answer.append(i)
            
    return len(answer)  # 소수의 개수를 반환

 

회고

 

map() 함수가 반환하는 타입이 iterator 객체이기 때문에 이를 출력하려면 list() 함수를 사용해 명시적으로 리스트로 변환하거나 next() 함수를 사용해서 요소를 하나씩 꺼내야 한다. 실제로 출력해 보니 <map object at 0x0000017dc5c7e350> 와 같은 메모리 주소와 객체 정보를 나타내는 문자열이 떴다. 

초반에 isPrime(num) 함수를 만들 때 2부터 num+1까지로 반복문을 구성하였는데 소수가 제대로 판별되지 않았는지 자꾸 0이 반환되어 당황했다. 효율성 문제라는데 효율성이 떨어지더라도 올바른 답이 출력되어야 하는 게 아닌가 싶다.

 

풀이와 오답에 약 2시간이 소요되었다는 점에서 isPrime 함수와 type을 변환하는 기본적인 함수는 꼭 체화해야겠다고 느꼈다.