N은 4의 배수로 주어지므로,
문자열 개수 = N / 4이고
해당 문자열 갯수 만큼 회전을 돌리면 처음 주어진 상태로 돌아오는 것을 파악하면 된다.
따라서 0 ~ N/4번 회전을 돌리면, 적혀진 수로 만들 수 있는 모든 숫자들을 구할 수 있다.
같은 숫자일 경우 중복 제거하기
for(int i = 0; i < window; i++) {
int rotateIdx = i;
...
}
start, end 인덱스 모두 원형 배열처럼 문자열을 순환할 수 있도록 한다.
start < end
문자열이 끝까지 도달하지 않고 순차적으로 처리할 수 있는 경우
substring(start, end)로 변의 값을 가져 온다.
start < end
원형 배열처럼 시작과 끝이 이어지는 경우
substring(start)로 문자열 끝까지의 부분을 가져오고, 이어서 substring(0, end)로 처음 부분을 가져온다.
for(int i = 0; i < window; i++) {
int rotateIdx = i;
for(int j = 0; j < 4; j++) { // 4번
int start = (rotateIdx + j * window) % N;
int end = (start + window) % N;
String hex;
if(start < end){
hex = input.substring(start, end);
}
else{
hex = input.substring(start) + input.substring(0, end);
}
int num = Integer.parseInt(hex, 16);
if(!list.contains(num)) list.add(num);
}
}
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.List;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for(int t = 1; t <= T; t++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 숫자의 개수
int K = Integer.parseInt(st.nextToken()); // K번째로 큰 수
String input = br.readLine();
int window = N / 4; // 각 변에는 동일한 개수의 숫자
List<Integer> list = new ArrayList<>();
for(int i = 0; i < window; i++) { // N/4 만큼 회전하기
int rotateIdx = i;
for(int j = 0; j < 4; j++) { // 4개의 변 숫자 추출하기
int start = (rotateIdx + j * window) % N;
int end = (start + window) % N;
String hex;
if(start < end){
hex = input.substring(start, end);
}
else{
hex = input.substring(start) + input.substring(0, end);
}
int num = Integer.parseInt(hex, 16);
if(!list.contains(num)) list.add(num);
}
}
Collections.sort(list, Collections.reverseOrder());
System.out.println("#" + t + " " + list.get(K-1));
}
}
}
보물상자 비밀번호 [SWEA 5658][JAVA][모의 SW 역량테스트]
출처: https://toastfactory.tistory.com/199 [이삭이의 토스트 공장:티스토리]