BruteForceSearch 프로그래머스 ‘소수 찾기’ 알고리즘 문제풀이

1 minute read

Problem

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

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

Solution

import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

class Solution {
    static List<Integer> numList = new ArrayList<Integer>();
    
    public int solution(String numbers) {
        int tmp = 0;
        
        makePrimeNum("", numbers);
        
        numList = numList.stream().distinct().collect(Collectors.toList()); // 중복값 제거
        numList.removeIf(a -> a == 1 | a == 0); // 0과 1은 소수가 아니다.
        
        for (int i = 0; i < numList.size(); i++) {
            tmp = numList.get(i);
            
            for (int j = 2; j < tmp; j++) {
                /* 자기보다 작은 수로 나눠서 나머지가 0이면 약수가 존재하므로 소수가 아님 */
                if (tmp % j == 0) {
                    numList.remove(i--); // 삭제하고나면, 리스트 사이즈 줄어드므로 인덱스 조정 필요
                    break;
                }
            }
        }

        return numList.size();
    }
    
    public void makePrimeNum(String str, String numStr) {
        if (numStr.length() == 0) {
            if (!str.equals(""))
                numList.add(Integer.parseInt(str));
        }
        else
        {
            for (int i = 0; i < numStr.length(); i++) {
                makePrimeNum(str + numStr.charAt(i), numStr.substring(0, i) + numStr.substring(i + 1, numStr.length()));
            }
            
            makePrimeNum(str, "");
        }
    }
}