공부/알고리즘

프로그래머스 소수찾기 자바 풀이(완전탐색02)

돌이토스 2021. 5. 12. 17:02

문제 설명

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

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

제한사항

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

입출력 예

numbersreturn

"17" 3
"011" 2

입출력 예 설명

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

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

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

#풀이


import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;



	class Solution {
	Set<Integer> set;
	List<Character> list;
	boolean[] check;
		public int solution(String numbers) {
			int answer = 0;

			set = new HashSet<Integer>();
			list = new ArrayList<Character>();
			check = new boolean[numbers.length()];

			for (int i = 0; i < numbers.length(); i++) {
				list.add(numbers.charAt(i));
			}

			for (int i = 0; i < numbers.length(); i++) {
				make(0, i + 1, "");
			}

			answer = set.size();
			return answer;
		}

		private void make(int cur, int max, String str) {

			if (cur == max) {
				isPrime(Integer.parseInt(str));
				return;
			}

			for (int i = 0; i < list.size(); i++) {
				if (!check[i]) {
					check[i] = true;
					str += list.get(i);
					make(cur + 1, max, str);
					str = str.substring(0, str.length() - 1);
					check[i] = false;
				}
			}
		}

		private void isPrime(int num) {

			int sqrt = (int) Math.sqrt(num);

			if (num == 2) {
				set.add(num);
			}
            
			if (num == 1 || num % 2 == 0) {
				return;
			}


			for (int i = 3; i <= sqrt; i += 2) {
				if (num % i == 0) {
					return;
				}
			}

			set.add(num);

		}
	}

DFS를 사용하였다. DFS를 사용할 메서드 make를 선언했고, 이 make를 for문 안에 넣어서, 자릿수 설정을 했다. make에는 새롭게수를추가할인덱스(cur), 자릿수(max), 직전문자열(str)을 매개변수로 받게설정했다.