프로그래머스-소수찾기

Dongwon Ahn·2020년 8월 21일
0

알고리즘 공부

목록 보기
7/8

문제

문제설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

제한사항

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

입출력 예
입출력 예 설명
예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.

예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.

11과 011은 같은 숫자로 취급합니다.

고민 🧐

  • 전에 풀었던 소수문제에서 감탄했던 소수 찾는 방법을 한번 써보면 어떨까?
  • 순열 처리는 어떻게 하지?

코드 순서 🤔

  1. 소수부터 만들자
LEN = 9999999
decimal = [False] + [True] * LEN
decimal[1] = False
m = int(LEN ** 0.5)
for i in range(2, m+1):
    if decimal[i] == True:
        for j in range(i+i, LEN+1, i):
            decimal[j] = False
  • 7이하의 문자열을 던져주기 때문에 최댓값을 가지고 미리 소수를 체크해보자
    • 정리하면서 느낀점
      이렇게 처음부터 최댓값 찾는거보다 자릿수에 맞는 값을 가지고 찾는 것이 조금 더 시간을 아낄수 있지 않을까?
  1. 소수 찾기
import itertools

def solution(numbers):
    number_list = list(numbers)
    chk_list = []
    answer = 0

    for j in range(1, len(number_list)+1):
        chk_list += list(map(''.join, itertools.permutations(number_list, j)))

    chk_list = list(set(chk_list))

    for chk in chk_list:
        if chk[0] != '0':
            if decimal[int(chk)]:
                answer += 1
    return answer
  • itertools.permutations 를 가지고 순열을 만들었습니다.
  • chk_list = list(set(chk_list)) : 순열 같은 경우 같은 숫자일 경우 체크가 안되기 때문에 중복값 제거해줍니다.

전체 코드 😀

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

def solution(numbers):
    number_list = list(numbers)
    chk_list = []
    answer = 0

    for j in range(1, len(number_list)+1):
        chk_list += list(map(''.join, itertools.permutations(number_list, j)))

    chk_list = list(set(chk_list))

    for chk in chk_list:
        if chk[0] != '0':
            if decimal[int(chk)]:
                answer += 1
    return answer


LEN = 9999999
decimal = [False] + [True] * LEN
decimal[1] = False
m = int(LEN ** 0.5)
for i in range(2, m+1):
    if decimal[i] == True:
        for j in range(i+i, LEN+1, i):
            decimal[j] = False
profile
Typescript를 통해 풀스택 개발을 진행하고 있습니다.

0개의 댓글