조급하면 모래성이 될뿐

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

Algorithm/Programmers

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

Pawer0223 2019. 11. 7. 23:31

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기 | 프로그래머스

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요. 제한사항 numbers는 길이 1 이상 7 이하인 문자열입니다. numbers는 0~9까지 숫자만으로 이루어져 있습니다. 013은 0, 1, 3 숫자가 적힌 종이

programmers.co.kr

나의 풀이

우선 문제를 보고 흩어진 숫자조각으로 조합 가능한 모든 숫자를 찾는 로직을 찾아야 된다고생각했다...

 

고민하다가 머리가 너무 아플것 같아서.. 조합을 찾지않고 가능한 방법을 선택하였다.

 

먼저 주어진 숫자 조합의 최대 값 이하의 소수를 구해준다.

		for ( int i = 2 ; i <= max; i++  ) {
			if ( visits[i] == 1 ) continue;
			for ( int j = 2*i; j <= max ; j+=i) {
				visits[j] = 1;
			}

 

구한 소수 중에서 흩어진 숫자에 없는 숫자가 포함되어있는 소수가 있으면 제외시켜준다.

			// 소수를 1차적으로 거른다. 흩어진 numbers에 해당되지 않는 값을 가지고있다면 처리대상이아니다.
			String[] iS = String.valueOf(i).split("");
			boolean possible = true;

			for ( int k = 0 ; k < iS.length; k++ ) {
				if ( !numbers.contains(iS[k])) {
					possible = false;
					break;
				}
			}

 

마지막으로 숫자가 포함되어있어도, 주어진 수보다 더 많은 숫자가 사용 된 경우가 있으면 제외시켜주었다.

ex) 흩어진 수 : 71일때, 11은 1이 두번나와서 흩어진 조각으로 완성시킬 수 없는 숫자이다.

			// 2차적으로 거른다. 흩어진 수보다 더 많은 수를 가지고있는 경우를 체크한다.
			StringBuilder temp = new StringBuilder(numbers);
			
			for ( int r = 0 ; r < iS.length; r++ ) {
				int index = temp.indexOf(iS[r]);
				if ( index == -1 ) {
					possible = false;
					break;
				}
				else temp.setCharAt(index, '#');
			}

 

package Programmers.Level2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class FindSosuLevel2 {

	public static void main(String[] args) {

		String n = "011" ;

		int result = solution(n);

		System.out.println(result);

	}//main

	public static int solution(String numbers) {
		
		int answer = 0;

		String[] nums = numbers.split("");

		Arrays.sort(nums,Collections.reverseOrder());

		String arrayNumber ="";

		for ( String num : nums ) {
			arrayNumber+=num;
		}

		int max = Integer.valueOf(arrayNumber);

		int[] visits = new int[max+1];

		List<Integer> prime = new ArrayList<Integer>();

		// 소수 체크. 0이면 소수다.
		for ( int i = 2 ; i <= max; i++  ) {
			if ( visits[i] == 1 ) continue;
			for ( int j = 2*i; j <= max ; j+=i) {
				visits[j] = 1;
			}

			// 소수를 1차적으로 거른다. 흩어진 numbers에 해당되지 않는 값을 가지고있다면 처리대상이아니다.
			String[] iS = String.valueOf(i).split("");
			boolean possible = true;

			for ( int k = 0 ; k < iS.length; k++ ) {
				if ( !numbers.contains(iS[k])) {
					possible = false;
					break;
				}
			}
			// 2차적으로 거른다. 흩어진 수보다 더 많은 수를 가지고있는 경우를 체크한다.
			StringBuilder temp = new StringBuilder(numbers);
			
			for ( int r = 0 ; r < iS.length; r++ ) {
				int index = temp.indexOf(iS[r]);
				if ( index == -1 ) {
					possible = false;
					break;
				}
				else temp.setCharAt(index, '#');
			}
			if ( possible ) prime.add(i);
		}

		answer = prime.size();

		return answer;
	}

}//class

제출 결과

반응형

'Algorithm > Programmers' 카테고리의 다른 글

[프로그래머스] 멀쩡한 사각형  (18) 2019.12.07
[프로그래머스] 더 맵게  (0) 2019.12.06
[프로그래머스] 위장  (0) 2019.11.07
[프로그래머스]가장 큰 수  (0) 2019.11.07
[프로그래머스]조이스틱  (5) 2019.11.07