SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제
각 변에 다음과 같이 16진수 숫자(0~F)가 적혀 있는 보물상자가 있다.
보물 상자의 뚜껑은 시계방향으로 돌릴 수 있고, 한 번 돌릴 때마다 숫자가 시계방향으로 한 칸씩 회전한다.
각 변에는 동일한 개수의 숫자가 있고, 시계방향 순으로 높은 자리 숫자에 해당하며 하나의 수를 나타낸다.
예를 들어 [Fig.1]의 수는 1A3, B54, 8F9, D66이고, [Fig.2]의 수는 61A, 3B5, 48F, 9D6이다.
보물상자에는 자물쇠가 걸려있는데, 이 자물쇠의 비밀번호는 보물 상자에 적힌 숫자로 만들 수 있는 모든 수 중, K번째로 큰 수를 10진 수로 만든 수이다.
N개의 숫자가 입력으로 주어졌을 때, 보물상자의 비밀 번호를 출력하는 프로그램을 만들어보자.
(서로 다른 회전 횟수에서 동일한 수가 중복으로 생성될 수 있다. 크기 순서를 셀 때 같은 수를 중복으로 세지 않도록 주의한다.)
입력
가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 숫자의 개수 N과 크기 순서 K가 주어 진다.
그 다음 줄에는 16진수 0~F 숫자가 공백 없이 N개 주어진다.
출력
출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
소스코드
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
String nums = br.readLine();
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
StringBuilder sb3 = new StringBuilder();
StringBuilder sb4 = new StringBuilder();
for (int j = 0; j < n; j++) {
if(j < n/4 * 1) sb1.append(nums.charAt(j));
else if(j < n/4 * 2) sb2.append(nums.charAt(j));
else if(j < n/4 * 3) sb3.append(nums.charAt(j));
else if(j < n/4 * 4) sb4.append(nums.charAt(j));
}
HashSet<Integer> set = new HashSet<>();
for (int j = 0; j < n / 4; j++) {
// 각 면의 16진수 값 저장
set.add(Integer.parseInt(sb1.toString(), 16));
set.add(Integer.parseInt(sb2.toString(), 16));
set.add(Integer.parseInt(sb3.toString(), 16));
set.add(Integer.parseInt(sb4.toString(), 16));
// Lotate start
String s1 = sb1.charAt(sb1.length() - 1) + "";
String s2 = sb2.charAt(sb2.length() - 1) + "";
String s3 = sb3.charAt(sb3.length() - 1) + "";
String s4 = sb4.charAt(sb4.length() - 1) + "";
// delete
sb1.deleteCharAt(sb1.length() - 1);
sb2.deleteCharAt(sb2.length() - 1);
sb3.deleteCharAt(sb3.length() - 1);
sb4.deleteCharAt(sb4.length() - 1);
// reverse
sb1 = sb1.reverse();
sb2 = sb2.reverse();
sb3 = sb3.reverse();
sb4 = sb4.reverse();
// append
sb1.append(s4);
sb2.append(s1);
sb3.append(s2);
sb4.append(s3);
// reverse
sb1 = sb1.reverse();
sb2 = sb2.reverse();
sb3 = sb3.reverse();
sb4 = sb4.reverse();
// Lotate end
}
List<Integer> list = set.stream().collect(Collectors.toList());
Collections.sort(list, Collections.reverseOrder());
sb.append("#" + (i + 1) + " " + list.get(k - 1) + "\n");
}
System.out.println(sb);
}
}
해결 방법
- 보물상자의 각 변에 있는 수를 각각 StringBuilder에 저장한다.
- StringBuilder에 저장된 수를 10진수로 변환하여 HashSet에 저장한다.
- Lotate 한다. Stringbuilder 끼리 값을 교환한다.
- 2, 3번의 과정을 반복한다.
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA] 1953번 : 탈주범 검거 (0) | 2023.11.08 |
---|---|
[SWEA] 1949번 : 등산로 조성 (1) | 2023.11.06 |
[SWEA] 16800번 : 구구단 걷기 (0) | 2023.11.05 |
[SWEA] 4615번 : 재미있는 오셀로 게임 (0) | 2023.11.05 |
[SWEA] 8016번 : 홀수 피라미드 (0) | 2023.11.03 |