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 |
첫 스터디, 첫 포스팅.
언제나 첫 시작이 중요하니까, 늘 처음처럼만.
'알고리즘' 카테고리의 다른 글
[Boj] S1 1041 주사위 (1) | 2020.04.19 |
---|---|
[SWEA] 1949. [모의 SW 역량테스트] 등산로 조성 (0) | 2020.04.19 |
[SWEA] 2117. [모의 SW 역량테스트] 홈 방범 서비스 (0) | 2020.04.19 |
[SWEA] 5653. [모의 SW 역량테스트] 줄기세포배양 (0) | 2020.04.19 |
[Boj] S1 2812 크게 만들기 (0) | 2020.04.14 |