[SW5658] 보물상자 비밀번호
✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/SW Expert Academy

[SW5658] 보물상자 비밀번호

 SW Expert Academy - 보물상자 비밀번호 

문제 링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo&categoryId=AWXRUN9KfZ8DFAUo&categoryType=CODE&problemTitle=sw&orderBy=PASS_RATE&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

 

문제 입출력

12 10
1B3B3B81F75E
503

 

문제 풀이

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Deque;
import java.util.HashSet;
import java.util.List;
import java.util.StringTokenizer;


public class Solution {
	static int ans, N, K, T;

	static HashSet<Integer> set = new HashSet<>();
	static Deque<Character> q = new ArrayDeque<>();

	static StringBuilder sb = new StringBuilder();


	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		T = Integer.parseInt(br.readLine());
		for (int t = 1; t <= T; t++) {
			// 초기화
			StringTokenizer st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			K = Integer.parseInt(st.nextToken());
			ans = -1;
			q.clear();
			set.clear();
			String line = br.readLine();
			for (int i = 0; i < N; i++) {
				q.offer(line.charAt(i));
			}

			// 시뮬레이션
			int R = N / 4;
			for (int r = 0; r < R; r++) {
				char ch = q.pollLast();
				q.addFirst(ch);
				check();
			}

			List<Integer> tempSet = new ArrayList<>(set);
			Collections.sort(tempSet, Collections.reverseOrder());
			ans = tempSet.get(K - 1);

			// 출력
			sb.append("#").append(t).append(" ").append(ans).append("\n");

		}

		System.out.println(sb.toString());

	} // end main


	// 한변씩 끊어 16진수 -> 10진수 변환하여 set에 추가하는 함수
	private static void check() {
		Object[] tempQ = q.toArray();

		for (int i = 0; i < N; i += (N / 4)) {
			String hex = "";
			for (int j = 0; j < N / 4; j++) hex += tempQ[i + j];
			set.add(Integer.parseInt(hex, 16));
		}

	} // end check
}
  • 덱으로 변경을 해서 끝에 것을 잘라 첫번째에 붙였다. 이런식으로 시계방향 회전을 표현했다.
  • 그런 다음 덱에 들어있는 값들을 한 변마다 뽑아내서 hex 값을 10진수로 고쳤다.
// 한변씩 끊어 16진수 -> 10진수 변환하여 set에 추가하는 함수
private static void check() {
    Object[] tempQ = q.toArray();

    for (int i = 0; i < N; i += (N / 4)) {
        String hex = "";
        for (int j = 0; j < N / 4; j++) hex += tempQ[i + j];
        set.add(Integer.parseInt(hex, 16));
    }

} // end check
}
  • 처음 안 건데 Integer.parseInt(hex, 16) 에서 이런식으로 두번째 인자에 8이나 16을 넣으면 oct 나 hex 값을 십진수로 변경할 수 있다! 반대로 하려면 Integer.toHex 뭐 이런식의 함수를 사용하면 된다.
  • 이렇게 만든 십진수를 set 에 저장한다. 이렇게 되면 중복값을 제거할 수 있다.
List<Integer> tempSet = new ArrayList<>(set);
Collections.sort(tempSet, Collections.reverseOrder());
ans = tempSet.get(K - 1);
  • set 을 List 로 변경하여 sort 를 한다.
  • HashSet 을 정렬하기 위해서는 List Collection 으로 변경을 해줘야한다.
  • K - 1 위치에 있는 값을 꺼내면 답이 된다.

 

 

 

 

 

 

 

# SW 보물상자 비밀번호 # 16진수 to 10진수 java # HashSet sort # HashSet List


 

728x90

'✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > SW Expert Academy' 카테고리의 다른 글

[SW2105] 디저트 카페  (0) 2022.09.29
[SW4008] 숫자 만들기  (0) 2022.09.29
[SW2115] 벌꿀 채취  (0) 2022.09.27
[SW1952] 수영장  (0) 2022.09.27
[SW1953] 탈주범 검거  (0) 2022.09.15