Algorithm

[SWEA] 5658. 보물상자 비밀번호

프로그래민 2020. 4. 29. 23:49
반응형

이문제는 단순 구현문제이다.

배열을 순환하는 방법은 크게 두가지가 있다. 첫번째로 인덱스를 이용하여 인덱스가 배열크기를 넘어가면 0으로 바꿔주면서 순환하는 방법과 두번째로 List를 사용하여 첫번째원소를 맨뒤에 붙이면서 순환하는 방법이 있다. 이 문제를 품에 있어 인덱스를 사용하는 방식을 사용하였고, 3중포문을 이용하여 문제를 해결하였다.

또 이문제에서는 중복체크를 하는 과정이 있는데, 순서가 있는 중복체크를 할때에는 TreeSet을 이용하면 된다. 또한, TreeSet에 순서정하는 방식을 정할땐 다음과 같이 comparator를 선언해주면 된다.
set=new TreeSet<>(new Comparator() {
public int compare(Integer o1, Integer o2) {
return -Integer.compare(o1, o2);
}
});

Set에 대해 간단히 정리하자면 크게 3가지가 있다.
1. HashSet : 순서가 필요없는 데이터를 hashTable에 저장. set중 성능 최고.
2. TreeSet : 저장된 데이터의 값에 따라 정렬. HashSet보다 성능 하위.
3. LinkedHashSet : 연견될 목록 타입으로 hashTable에 데이터 저장. 저장된 순서에 따라 값이 정렬. set중 성능 최하.

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
63
64
65
66
67
68
package swea;
 
 
public class Solution_5658_보물상자비밀번호 {
    
    static int N;
    static int target;
    static int word;
    static char[] chars;
    static Set<Integer> set;
    
    public static void main(String[] args) throws Exception {
        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        
        int T=Integer.parseInt(br.readLine());
        
        for(int tc=1;tc<=T;tc++) {
            st=new StringTokenizer(br.readLine());
            N=Integer.parseInt(st.nextToken());
            target=Integer.parseInt(st.nextToken());
            
            String str= br.readLine();
            chars=new char[str.length()];
            for(int i=0;i<str.length();i++)
                chars[i]=str.charAt(i);
            
            set=new TreeSet<>(new Comparator<Integer>() {
                public int compare(Integer o1, Integer o2) {
                    return -Integer.compare(o1, o2);
                }
            });
            word=N/4;
            for(int loop=0;loop<word;loop++) {
                for(int start=0;start<str.length();start=start+word) {
 
                    String temp="";
                    for(int index=0;index<word;index++) {
                        int i=loop+start+index;
                        if(i>=str.length()) {
                            i=i-str.length();
                        }
                        temp+=chars[i];
                    }
//                    System.out.print(temp+" ");
                    set.add(Integer.parseInt(temp,16));
                }
//                System.out.println();
            }
            int i=0;
            for(int num : set) {
                i++;
                if(i==target) {
                    System.out.println("#"+tc+" "+num);
                    break;
                }
            }
        }
        
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
                                                  
반응형

'Algorithm' 카테고리의 다른 글

[SWEA] 6019. 추억의 2048게임  (0) 2020.04.30
[SWEA] 4050. 재관이의 대량 할인  (0) 2020.04.30
[Programmers] 불량 사용자  (0) 2020.04.28
[Programmers] 튜플  (0) 2020.04.27
[Programmers] 크레인 인형뽑기 게임  (0) 2020.04.27