풀이
- 한 방향으로 돌아가는 것을 보고 Queue를 떠올렸다.
- 회전 수, 4변, 각 변의 길이 -> 반복문 조건문을 위한 규칙성을 찾는다.
- 16진수를 10진수로 변경하는 메소드를 구현한다.
코드
package SWEA_AD;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Solution_5658 {
private static Queue<Character> q;
private static int N;
private static int K;
private static char last;
private static HashSet<String> hs;
private static ArrayList<Integer> answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for(int tc = 1; tc <= T; tc++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
q = new LinkedList<>();
char arr[]= br.readLine().toCharArray();
last =' ';
for(int i = 0; i < N; i++) {
q.offer(arr[i]);
if(i == N-1) last = arr[i];
}
hs = new HashSet<>();
answer = new ArrayList<>();
Rotate();
Collections.sort(answer, Collections.reverseOrder());
System.out.println("#" + tc + " "+ answer.get(K-1));
}
}
private static void Rotate() {
for(int i = 0; i < N / 4; i++) {
q.offer(last);
for(int j = 0; j < 4; j++) {
String tmp = "";
char[] convertArr = new char[N / 4];
for(int k = 0; k < N / 4; k++) {
char c =q.poll();
tmp += c;
convertArr[k] = c;
if(j == 3 && k == N/4 -2) {
last = c;
}
if(j == 3 && k == N/4 -1) {
continue;
}
q.offer(c);
}
if(hs.contains(tmp)) continue;
else {
hs.add(tmp);
answer.add(convertNum(convertArr));
}
}
}
}
private static int convertNum(char[] convertArr) {
int tenNum = 0;
int posSize = 1;
for(int i = convertArr.length-1; i >= 0; i--) {
int number = 0;
if((convertArr[i] - '0') > 9) {
number = convertArr[i] - 'A' + 10;
}else {
number = convertArr[i] - '0';
}
tenNum += posSize * number;
posSize *= 16;
}
return tenNum;
}
}