CS/알고리즘_고득점 kit(자바)

소수 찾기

Jedy_Kim 2021. 12. 20. 21:19
728x90

https://programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기

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

programmers.co.kr

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

 

문제 회고

 

코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.*;
 
 
class Solution {
    
    final int MAX = 10000000;        
    int len = 0;
    HashSet<Integer> set = new HashSet<>();
    String[]  strNums = null;
    boolean[] visited = null;
    boolean[] primeList = new boolean[MAX];
    
    
    // 종이 조각으로 만들 수 있는 모든 경의우의 소수를 구한다.
    public void getResult(int x, String strNum) {
        
        // 소수판별
        if ( strNum != "") {
            int num = Integer.parseInt( strNum );
            if ( !primeList[num] ) set.add( num );
        } 
        
        // 기저조건
        if ( x >= len ) return
        
        // 다음 차례 진행
        for ( int i = 0; i < len; ++i ) { 
            if ( visited[i] ) continue// 한번 사용된 요소는 다시 사용하면 안되므로 필터링해준다.
            visited[i] = true;
            getResult( x+1, strNum + strNums[i] );
            visited[i] = false
        }
        
    }
    
    
    // main
    public int solution(String numbers) {
 
        // 에라토스테네스의 체 : 한번에 소수를 미리 구해둔다.
        // false : 소수, true : 소수아님
        primeList[0= true;
        primeList[1= true;
        for ( int i = 2; i < MAX; ++i ) {
            for ( int j = i + i; j < MAX; ) {
                primeList[j] = true;
                j += i;
            }
        }
         
        // 초기화 
        strNums = numbers.split("");
        len = strNums.length;
        visited = new boolean[len];
        
        // 연산을 시행한다.
        getResult( 0"" ); 
        
        // 정답
        return set.size();
    }
}
cs

 

반응형

'CS > 알고리즘_고득점 kit(자바)' 카테고리의 다른 글

체육복  (0) 2021.12.22
카펫  (0) 2021.12.21
모의고사  (0) 2021.12.17
H-Index  (0) 2021.12.16
가장 큰 수  (0) 2021.12.15