본문 바로가기

알고리즘

[SWEA] 5658. [모의 SW 역량테스트] 보물상자 비밀번호


5658. [모의 SW 역량테스트] 보물상자 비밀번호

 


 

문제링크

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

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


 

문제를 이해하는 데 오래 걸렸다.

문제에 언급된 [Fig.1], [Fig.2] 가 도대체 뭘까 고민했는데 전혀 상관없는 문장이었다.

 

리스트에 숫자를 모두 입력 받고 인덱스만 조절해주면 될 것 같았는데,

머리가 잘 안돌아가서 맨 뒤에 숫자를 맨 앞으로 넣어주는 식으로 진행했다.

 

먼저, 계산의 편의를 위해서 16진수 숫자열을 10진수로 변환하여 리스트에 추가했다.

그리고 반복을 돌며 한 변에 올 수 있는 숫자 갯수만큼 16진수에서 10진수로 변환해주고,

중복 제거를 위해 TreeSet 에 넣어주었다.

 

TreeSet 에서 K번째로 큰 수를 뽑을 수가 없어서 iterator 를 이용해서 result 리스트로 다시 옮겨넣었다.

오름차순으로 정렬하기 위해서 TreeSet 의 Comparator 메소드를 오버라이딩 해줬는데,

스터디원의 코드 리뷰를 하고나니 되게 여러 방법이 있더라.

 

1) set.add() 할 때, -1을 곱해주고 결과 출력 시 -를 없애주는 방법

2) descendingIterator() 메소드 이용하는 방법

 

▼나는 나만의 방식대로

 

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
 
public class Solution_sw_5658_보물상자비밀번호 {
 
    static int T, N, K; // N:숫자 갯수, K: k번째 큰수
    static ArrayList<Integer> list, result;
    static TreeSet<Integer> set;
 
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        T = Integer.parseInt(br.readLine());
        for (int t = 1; t <= T; t++) {
            String str[] = br.readLine().split(" ");
            N = Integer.parseInt(str[0]); // N : 숫자 갯수
            K = Integer.parseInt(str[1]); // K : 번째 큰수
            char[] nums = br.readLine().toCharArray();
            list = new ArrayList<Integer>();
            result = new ArrayList<Integer>();
            set = new TreeSet<Integer>(new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return Integer.compare(o1, o2) * -1;
                }
            });
 
            for (int i = 0; i < N; i++) { // 16진수를 10진수로 표현 ex ) A->10
                if ((int) nums[i] >= 65)
                    list.add(nums[i] - 55);
                else
                    list.add(nums[i] - '0');
            }
 
            for (int n = 0; n < N / 4; n++) {
                for (int i = 0; i < N; i += N / 4) {
                    makeNum(i);
                }
                list.add(0, list.get(N - 1));
                list.remove(N);
            }
            Iterator<Integer> iter = set.iterator();
            while (iter.hasNext()) {
                result.add(iter.next());
            }
            sb.append("#" + t + " " + result.get(K - 1+ "\n");
        }
        System.out.println(sb.toString());
    }
 
    private static void makeNum(int start) {
        int exp = (N / 4- 1;
        int sum = 0;
        for (int i = start, end = start + (N / 4- 1; i <= end; i++) {
            sum += list.get(i) * Math.pow(16, exp--);
        }
        set.add(sum);
    }
}
 
cs

 

 

첫 스터디, 첫 포스팅.

언제나 첫 시작이 중요하니까, 늘 처음처럼만.