Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

최's 먹공로그

SEA5658_보물상자 비밀번호 본문

APS

SEA5658_보물상자 비밀번호

ChoiSH313 2019. 7. 15. 22:16

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo


문제정리

1. 보물 상자의 뚜껑은 시계방향으로 돌릴 수 있고 , 한번 돌릴 때마다 숫자가 시계방향으로 한 칸씩 회전한다

2. 각 변에는 동일한 개수의 숫자가 있고 , 시계방향 순으로 높은 자리 숫자에 해당하며 하나의 수를 나타낸다

3. 보물상자에는 자물쇠가 걸려있는데 , 이 자물쇠의 비밀번호는 보물 상자에 적힌 숫자로 만들 수 있는 모든 수 중 , K번째로 큰 수를 10진 수로 만든 수이다

4. N개의 숫자가 입력으로 주어졌을 때 , 보물상자의 비밀 번호를 출력하는 프로그램을 만들어 보자

5. 서로 다른 회전 횟수에서 동일한 수가 중복으로 생성될 수 있다 , 크기 순서를 셀 때 같은 수를 중복으로 세지 않도록 주의 한다

6. 8<=N<=28(4의 배수) 숫자의 개수

K 크기 순서

16진수 0~F 숫자가 공백없이 N개 주어진다


문제issue

1. N에 따라서 최대 회전 회수가 정해진다

N = 8 이면 회전 = 1

N = 12 면 회전 = 2

N = 16 이면 회전 = 3

N = 20 이면 회전 = 4

N = 24 이면 회전 = 5

N = 28 이면 회전 = 6


해결흐름

1. N 크기의 배열에 N개의 숫자 넣는다

2. N/4자리씩 끊어서 10진수로 변환한 숫자를 저장한다

3. 회전한다

4. 10진수로 변환한 숫자를 저장한 배열이든 리스트든 sort 및 중복제거 한다

5. K번째 숫자를 도출한다


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.StringTokenizer;
 
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
 
public class Solution {
 
    public static void main(String[] args) throws Exception {
        // input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int test_case = Integer.parseInt(br.readLine().trim());
        for (int t = 1; t <= test_case; t++) {
            StringTokenizer st = new StringTokenizer(br.readLine().trim(), " ");
            int N = Integer.parseInt(st.nextToken());
            int K = Integer.parseInt(st.nextToken());
            char[] arr = new char[N];
            int[] number = new int[N];
            String s = br.readLine();
            for (int i = 0; i < N; i++) {
                arr[i] = s.charAt(i);
            }
            // start
            // arr에서 N/4 만큼 끊어서 십진수로 변환하고 number에 저장
            int loop = 0;
            int number_idx = 0;
            while(true) {
                if(loop == N/2-1) {
                    break;
                }
                // 숫자 저장
                for (int i = 0; i < arr.length; i+=N/4) {
                    // temp에 끊은 자리수를 넣고
                    int[] temp = new int[N/4];
                    int temp_idx = 0;
                    for (int j = i; j < i+N/4; j++) {
                        if(arr[j] == 'A') {
                            temp[temp_idx++= 10;
                        } else if(arr[j] == 'B') {
                            temp[temp_idx++= 11;
                        } else if(arr[j] == 'C') {
                            temp[temp_idx++= 12;
                        } else if(arr[j] == 'D') {
                            temp[temp_idx++= 13;
                        } else if(arr[j] == 'E') {
                            temp[temp_idx++= 14;
                        } else if(arr[j] == 'F') {
                            temp[temp_idx++= 15;
                        } else {
                            temp[temp_idx++= arr[j] - '0';
                        }
                    }
                    // temp에 있는 16진수를 10진수로 변경해서 number_10에 더하고 number 배열에 저장
                    int hex_number = 1;
                    int number_10 = 0;
                    for (int j = temp.length-1; j >= 0; j--) {
                        number_10 += temp[j] * hex_number;
                        hex_number *= 16;
                    }
                    if(number_idx < N) {
                        number[number_idx++= number_10;
                    }
                }
                // arr을 회전
                char temp = arr[arr.length-1];
                for (int i = arr.length-2; i >= 0; i--) {
                    arr[i+1= arr[i];
                }
                arr[0= temp;
                loop++;
            }
            // 중복 제거 및 내림차순 정렬 후 K번째 숫자 출력
            HashSet<Integer> hash = new HashSet<>();
            List<Integer> list = new ArrayList<Integer>();
            for (int i = 0; i < number.length; i++) {
                hash.add(number[i]);
            }
            for (Integer i : hash) {
                list.add(i);
            }
            Collections.sort(list, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o2-o1;
                }
            });
            for (int i = 0; i < list.size(); i++) {
                number[i] = list.get(i);
            }
            System.out.println("#" + t + " " + number[K-1]);
        } // end of test_case
    } // end of main
// end of class
cs

'APS' 카테고리의 다른 글

SEA5650_[모의 SW 역량테스트] 핀볼 게임  (0) 2019.08.08
SEA5656_벽돌깨기  (0) 2019.07.18
BOJ14888_연산자끼워넣기  (2) 2019.07.10
BOJ14889_스타트와 링크  (0) 2019.07.06
BOJ15683_감시  (4) 2019.06.29