[프로그래머스] (LV2) 소수 찾기

[프로그래머스] (LV2) 소수 찾기

소수 찾기

JavaScript, Python

문제 설명

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

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

제한사항

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

입출력 예

numbers return
“17” 3
“011” 2

입출력 예 설명

예제 #1\
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.

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

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

출처



풀이


javascript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function solution(numbers) {

const isPrimary = (n) =>
n>2 ? ![...Array(Math.ceil(Math.sqrt(n))+1).keys()].slice(2).map(i => !(n%i)).includes(true) : n===2

const permutator = (inputArr) => {
let result = [];

const permute = (arr, m = []) => {
if(m.length)
result.push(m)

if (arr.length === 0) {
result.push(m)
} else {
for (let i = 0; i < arr.length; i++) {
let curr = arr.slice();
let next = curr.splice(i, 1);
permute(curr.slice(), m.concat(next))
}
}
}
permute(inputArr)
const resultMap = result.map((arr)=>arr.join('')*1);
return [...new Set(resultMap)]

}
return permutator(numbers.split('')).filter(isPrimary).length

}


python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from itertools import permutations
def solution(numbers):
sets = set()

def isPrime(n):
if n == 0 or n == 1: return False
if n == 2: return True
for k in range(2,int(n ** (1/2))+2):
if n % k == 0: return False
return True

for i in range(1,len(numbers)+1):
for s in list(set([int(''.join(p)) for p in permutations(list(numbers),i)] )):
sets.add(s)

return len(list(filter(isPrime, list(sets))))



설명


순열에 해당하는 bfs 함수 구현이 특징인 문제다.
내장함수에서 순열 기능을 제공하지 않는 언어에서는 난이도가 더 높아진다.

javascript로는 이를 재귀함수로 구현했다.
그러나 사실상 for문의 중첩(bfs)으로 이뤄져 있어서, 매우 무겁게 작동한다.

소수를 구하는 isPrime 함수와 순열 함수 구현이 끝나면, 뒤는 간단하다.
순열 목록에서 중복값을 제거하고 모두 isPrime 에 대입해서 결과를 얻는다.



출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges


[프로그래머스] (LV2) 소수 찾기

https://sklubmk.github.io/2021/06/30/dcc75b1cb9ed/

Author

Jinki Kim

Posted on

2021-06-30

Updated on

2021-08-05

Licensed under

댓글