Post

5658. [모의 SW 역량테스트] 보물상자 비밀번호

문제 링크

SWEA 5658 보물상자 비밀번호

풀이

굉장히 단순한 문제인데 자바 사용이 익숙하지 않아서 배운게 많은 문제이다.

우선 나올 수 있는 16진수 수를 중복없이 내림차순으로 정해야 한다. 따라서 TreeSet 구조체를 이용했다.

1
2
3
4
5
6
TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() {
  @Override
  public int compare(Integer a, Integer b) {
    return b.compareTo(a);
  }
});

내림차순이므로 Comparator를 생성하여 TreeSet의 생성자의 인자로 넣어주었다.

1
2
3
4
5
6
7
8
9
for(int i = 0; i < N; i++) {
  StringBuilder sb = new StringBuilder("");
  for(int j = 0; j < N/4; j++) {
    int index = i + j < N ? i + j : i + j - N;
    sb.append(s.charAt(index));
  }
  int value = Integer.parseInt(sb.toString(),16);
  ts.add(value);
}

그리고 단순하게 반복문을 돌면서 나올 수 있는 모든 경우의 수를 TreeSet에 넣어주었다. 16진수 문자열을 어떻게 10진수로 바꿀까 고민했는데 그냥 Integer.parseInt(sb.toString(),16)로 바꿀 수 있었다. 공부하자!

1
2
3
4
5
6
7
8
9
10
public static int findKthElement(TreeSet<Integer> set,int K) {
  Iterator iter = set.iterator();
  int index = 0;
  while(iter.hasNext()) {
    int value = (int)iter.next();
    if(index == K - 1) return value;
    index++;
  }
  return -1;
}

K번째를 구하기 위해 iterator를 사용하여 TreeSet을 순회하며 K번째 일 때의 값을 리턴했다.

1
List<Integer> list = new ArrayList<>(treeSet);

순회하는 방식도 좋지만 List로 변환시켜서 값을 가져올 수도 있다.

전체 코드

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
import java.util.*;
import java.io.*;

class Solution
{
	public static int findKthElement(TreeSet<Integer> set,int K) {
		Iterator iter = set.iterator();
		int index = 0;
		while(iter.hasNext()) {
			int value = (int)iter.next();
			if(index == K - 1) return value;
			index++;
		}
		return -1;
	}
	public static void main(String args[]) throws Exception
	{
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T;
		T=Integer.parseInt(br.readLine());

		for(int test_case = 1; test_case <= T; test_case++)
		{
			
			String[] input = br.readLine().split(" ");
			int N = Integer.parseInt(input[0]);
			int K = Integer.parseInt(input[1]);
			String s = br.readLine();
			
			TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() {
				@Override
				public int compare(Integer a, Integer b) {
					return b.compareTo(a);
				}
			});
			
			for(int i = 0; i < N; i++) {
				StringBuilder sb = new StringBuilder("");
				for(int j = 0; j < N/4; j++) {
					int index = i + j < N ? i + j : i + j - N;
					sb.append(s.charAt(index));
				}
				int value = Integer.parseInt(sb.toString(),16);
				ts.add(value);
			}
			
			System.out.printf("#%d %d\n",test_case, findKthElement(ts,K));

		}
	}
}
This post is licensed under CC BY 4.0 by the author.