[SWEA] 5658 보물상자 비밀번호
완탐~!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
int idx = 1;
StringBuilder sb = new StringBuilder();
while(t-->0) {
// 중복하지 말래서 해쉬셋 썼다
HashSet<Integer> set = new HashSet<Integer>();
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken()) -1;
// 로테이션 할 횟수는 전체 숫자를 4로 나누면 된다.
// 이 이상 로테이션 해봐야 어차피 중복이다
int l = n/4;
String s = br.readLine();
while(l-- > 0){
// 스트링을 띄엄띄엄 해가면서 10진수로 바꿔 저장하자
for(int i = 0 ; i < n ; i += n/4) {
if( i + n/4 >= n ) {
// 단, 맨 마지막 숫자의 경우 substring에서 인덱스 예외가 발생
set.add(Integer.parseInt(s.substring(i), 16));
}else {
set.add(Integer.parseInt(s.substring(i, i + n/4), 16));
}
}
// 다 구했다면 이제 스트링을 한칸씩 땡겨주자
s = s.substring(n-1) + s.substring(0, n-1);
}
// 정렬을 위해 list에 다시 담아본다
List<Integer> list = new ArrayList<Integer>(set);
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if(o1 > o2) { // 내림차순으로 정렬하기
return -1;
}else return 1;
}
});
// 출력부
sb.append("#" + idx++ + " " + list.get(k) + "\n");
}
System.out.println(sb);
}
}
Comments