본문 바로가기
Problem Solving/Programmers

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

by 테리는당근을좋아해 2020. 4. 1.

문제설명

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

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

제한사항

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

해결 방법

DFS(깊이우선탐색)을 사용했다.

 

1) DFS로 입력된 정수 배열로 만들 수 있는 숫자를 모두 찾는다.

 

2) 숫자가 소수인지 판별한다.

 

3) 소수이면 set에 저장해 중복되는 값을 제거한다.

 

JAVA

package programmers;

import java.util.*;

public class p_42839 {
	static HashSet <Integer> map = new HashSet<>();
	static int[] visit;
	
	public static boolean check(int num) {
		if(num == 1 || num == 0) return false;
		for(int i = 2; i <= Math.sqrt(num); i++) {
			if(num % i == 0) {
				return false;
			}
		}
		return true;
	}
	
	public static void dfs(int x, String s, String num) {
		visit[x] = 1;
		num += String.valueOf(s.charAt(x));
		int tmp = Integer.parseInt(num);
		if(!map.contains(tmp) && check(tmp)) {
			map.add(tmp);
		}
		
		for(int i = 0; i < s.length(); i++) {
			if(visit[i] == 0) dfs(i, s, num);
		}
		visit[x] = 0;
	}
	public static int solution(String s) {
		visit = new int[s.length()];
		for(int i = 0; i < s.length(); i++) {
			dfs(i, s, "");
		}
		
		return map.size();
	}
	public static void main(String[] args) {
		String s = "17";
		String s2 = "011";
		System.out.println(solution(s));
	}
}

댓글