5658. [모의 SW 역량테스트] 보물상자 비밀번호
문제 링크
풀이
굉장히 단순한 문제인데 자바 사용이 익숙하지 않아서 배운게 많은 문제이다.
우선 나올 수 있는 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.