Alogorithm

[Algorithm] 프로그래머스 - 소수 찾기 (브루트포스 - Brute Force)

Daniel(빡일) 2020. 5. 25. 21:46
반응형

 

 

 

프로그래머스 문제입니다.

문제 설명

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

각 종이 조각에 적힌 숫자가 적힌 문자열 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은 같은 숫자로 취급합니다.

문제풀이

function solution(numbers) {
    var answer = 0
    
    // (1)
    const permutation = recursive(numbers.split(''))
    const filtered =  [...new Set(permutation)]
    // (2)
    const max = Math.max(...filtered)
    const eNet = eNetFilter(max)
  
    // (3)
    filtered.forEach(filtered_num => {
        if (eNet[filtered_num] === true) answer++
    })
        
    // (4) get eratosthenes net
    function eNetFilter(max) {
        let net = new Array(max + 1).fill(true)
        net[0] = false
        net[1] = false
        for (let i = 2; i < max + 1; i++) {
            if (net[i] === true) {
                for (var j = i+i;  j < max + 1; j+=i) net[j] = false
            }
        }
        return net
    }
    
    // (5) get all possible strings -> permutation
    function recursive (arr, prefix) {
       let _prefix = prefix || ''
       return arr.reduce((acc, cur, idx) => {
         acc.push(Number(_prefix + cur))
         const remainList = [...arr]
         remainList.splice(idx, 1)
         const remain = recursive(remainList, _prefix + cur)
         acc.push(...remain)
         return acc
       }, [])
    }
    
   return answer
}

 

idea: permutation을 구하기 위해 recursive (재귀 함수)를 사용하고, 에라토스테네스 체를 사용해서 prime의 여부를 가립니다.

1.  permutation (순열)을 통해 모든 경우의 수 리스트를 구하고, array -> set -> array 를 통해서 중복된 항목들을 걸러냅니다.

2. set으로 filter된 리스트에서 max 값을 통해 에라토스테네스의 체를 만듭니다.

3. 리스트의 아이템마다 소수(prime) 여부를 확인한 후 answer 값을 증가시킵니다.

4. max 정수를 받아 max까지의 에라토스테네스의 체 배열을 만들어 리턴합니다.

5. 순열을 통해 모든 경우의 수를 고려하기 위해 재귀함수를 사용합니다.

   첫번째 인덱스부터 요소를 하나씩 빼서(cur) 순열 리스트 (acc)에 넣고 픽스 (_prefix + cur) 시킵니다.

   고정된 리스트의 이외를 인자로 하여 다시 recursive 함수를 콜합니다.

그리고 return!

반응형