728x90
각 변에 다음과 같이 16진수 숫자(0~F)가 적혀 있는 보물상자가 있다.
보물 상자의 뚜껑은 시계방향으로 돌릴 수 있고, 한 번 돌릴 때마다 숫자가 시계방향으로 한 칸씩 회전한다.
각 변에는 동일한 개수의 숫자가 있고, 시계방향 순으로 높은 자리 숫자에 해당하며 하나의 수를 나타낸다.
예를 들어 [Fig.1]의 수는 1A3, B54, 8F9, D66이고, [Fig.2]의 수는 61A, 3B5, 48F, 9D6이다.
보물상자에는 자물쇠가 걸려있는데, 이 자물쇠의 비밀번호는 보물 상자에 적힌 숫자로 만들 수 있는 모든 수 중, K번째로 큰 수를 10진 수로 만든 수이다.
N개의 숫자가 입력으로 주어졌을 때, 보물상자의 비밀 번호를 출력하는 프로그램을 만들어보자.
(서로 다른 회전 횟수에서 동일한 수가 중복으로 생성될 수 있다. 크기 순서를 셀 때 같은 수를 중복으로 세지 않도록 주의한다.)
보물상자의 비밀번호를 길이가 N인 Char 배열에 저장하고
오른쪽으로 한칸 미는 함수를 구현한다.(당연히 맨 오른쪽부터 한칸씩 밀어야된다 맨오른쪽은 맨왼쪽으로)
총 N/4번 밀 수 있고
한번 밀때마다 16진수를 10진수로 바꾸는 xtoInt라는 함수를 호출하고 Set에 넣는다.(중복을 허락하지 않으므로)
그 다음 정렬을 하기 위해 Set를 다시 ArrayList.addAll을 이용하여 ArrayList에 담고 Collections.sort을 이용하여 정렬하면 끝
매우 간단한 구현 문제였다.
package swea;
import java.util.*;
import java.io.*;
public class 보물상자비밀번호 {
public static class MyScanner {
BufferedReader bf;
StringTokenizer st;
MyScanner() {
bf = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreTokens()) {
try {
st = new StringTokenizer(bf.readLine());
} catch (Exception e) {
e.printStackTrace();
}
}
return st.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyScanner sc = new MyScanner();
int T = sc.nextInt();
StringBuilder sb = new StringBuilder();
for (int tc = 1; tc <= T; tc++) {
int answer = 0;
int N = sc.nextInt();
int K = sc.nextInt();
char cmap[] = new char[N];
cmap = sc.next().toCharArray();
Set<Integer> s = new HashSet<Integer>();
for (int i = 0; i <= N / 4; i++) {
for (int j = 0; j < 4; j++) {
s.add(xtoInt(cmap, N / 4 * j, N / 4 * (j + 1) - 1));
}
char temp = cmap[N - 1];
for (int j = N - 1; j >= 1; j--) {
cmap[j] = cmap[j - 1];
}
cmap[0] = temp;
}
ArrayList<Integer> arr = new ArrayList<Integer>();
arr.addAll(s);
Collections.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return -(o1 - o2);
}
});
answer = arr.get(K - 1);
sb.append("#").append(tc).append(" ").append(answer).append("\n");
}
System.out.println(sb.toString());
}
static int xtoInt(char[] cmap, int left, int right) {
int r = 1;
int sum = 0;
for (int i = right; i >= left; i--) {
if (cmap[i] >= 'A' && cmap[i] <= 'F') {
sum += r * (cmap[i] - 'A' + 10);
} else {
sum += r * (cmap[i] - '0');
}
r *= 16;
}
return sum;
}
}
'알고리즘 > SWEA' 카테고리의 다른 글
swea 9843 촛불 이벤트 (0) | 2020.05.23 |
---|---|
SWEA [모의 SW 역량테스트] 등산로 조성 (0) | 2020.05.01 |