이 문제에서는 String으로 주어진 16진수를 어떻게 10진수로 쉽게 변환하고, 어떻게 Rotate를 간단하게 할 수 있는지, 중복 문자열을 어떻게 쉽게 체크하는지, 생성 가능한 수를 내림 차순으로 어떻게 정렬할지가 관건인 문제라고 생각합니다.
(1) 저는 16진수를 10진수로 parseLong(변환할 16진수 문자열, 16) 메소드로 해결 하고,
(2) Rotate 하는 것은 새로운 문자열 String s2 를 선언해서 가장끝에 있는 문자열을 가장 처음에 가져오고, substring으로 처음부터 마지막전까지 문자열을 잘라 더하는 방법으로 해결했습니다.
(3) 잘려진 중복문자열은 HashSet에 넣어서 중복되면 애초에 들어가지 않게 했습니다.
(4) 마지막으로 HashSet에 담긴 문자열을 어떻게 내림차순으로 정렬할 지는 List로 변환하여 Collection.sort() 를 사용했습니다.
[ 문제 풀이 ]
1. String s 에는 초기 문자열을 담아 줍니다. 나중에 s와 계속 비교하면서 Rotate할 때 같게 된다면 초기 문자열로 돌아올 것이기 때문에 break할 조건이 됩니다.
2. input(s) 함수는 문자열 s를 넣으면 N/4 개수만큼 문자열s를 잘라서 중복없이 HashSet에 넣어줍니다.
3. s1에는 s를 넣고 변화하는 문자열을 계속 담아주고 s2에는 s1을 오른쪽으로 한칸 Rotate한 문자열을 담아 줍니다.
4. 정렬을 오름차순으로 했기 때문에 16진수를 10진수로 변환할 때 list.size()-K 번 째 index에 있는 16진수를 변환시켜줘야 정답입니다.
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 {
static int N, K, l;
static HashSet<String> hs;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
int T = Integer.parseInt(br.readLine());
for(int tc=1; tc<=T; tc++) {
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 숫자의 개수
K = Integer.parseInt(st.nextToken()); // 순서
l = N/4; // 자를 문자의 개수
hs = new HashSet();
String s = br.readLine();
// l 개씩 짤라서 중복을 허락하지 않고 HashSet에 삽입하는 함수.
input(s);
String s1 = s;
String s2 = null;
while(true) {
s2 = s1.charAt(s1.length()-1) + s1.substring(0, s1.length()-1);
if(s2.equals(s)) break;
else {
input(s2);
s1 = s2;
}
}
List list = new ArrayList(hs);
// 역순 정렬
// Collections.sort(list, Comparator.reverseOrder());
Collections.sort(list);
Long answer = Long.parseLong((String)list.get(list.size()-K), 16);
System.out.println("#" + tc + " " + answer);
}
}
public static void input(String data) {
for(int i=0; i<data.length()-l+1; i+=l) {
hs.add(data.substring(i, i+l));
}
}
}
'알고리즘 > SW 역량 테스트' 카테고리의 다른 글
5644. [모의 SW 역량테스트] 무선 충전 (0) | 2020.07.08 |
---|---|
[백준] 19236. 청소년 상어 (0) | 2020.06.29 |
5650. [모의 SW 역량테스트] 핀볼 게임 (0) | 2020.05.07 |
[백준] 17822. 원판 돌리기 (0) | 2020.04.28 |
[백준] 17837. 새로운 게임2 (0) | 2020.04.24 |