[프로그래머스]Lv.2 소수 찾기(Python)
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을 변환하는 기본적인 함수는 꼭 체화해야겠다고 느꼈다.