console.log

[SWEA] 5658 보물상자 비밀번호 JAVA 본문

알고리즘/SW Expert Academy

[SWEA] 5658 보물상자 비밀번호 JAVA

foresight 2023. 10. 10. 00:43

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

 

SW Expert Academy

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

swexpertacademy.com

 

메모리 : 22,384kb
실행시간 : 126ms

 

문제분석

단순구현

아주 단순한 구현문제

1. 회전수 구하기
2. 회전시키기
3. 16진수 중복제거
4. 10진수로 변환해서 정렬
5. k번째 수 찾기

 

걸린시간

30분 ⏱️

 

풀이방법

  0회전
  1회전
  2회전
  ...
  N / 4 회전
  
  1. 문자열 입력받기
  2. 배열을 이용해 회전시키기
  3. 문자열 / 4 만큼 배열에서 뽑으면서 해시셋에 16진수 저장 (중복 제거)
  4. 16진수 10진수로 변환해 배열에 저장
  5. 배열 정렬 (오름차순 정렬 후 뒤에서 k번째 뽑기)
  6. 뒤에서 k번째 수 뽑아내기

 

포인트

딱히 없다 ... 그냥 단순 구현이라서

 

코드

package study.day0908;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.StringTokenizer;

public class SWEA_5658_보물상자비밀번호 {	// 메모리 : 22384 kb		실행시간 : 126 ms
	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("data/5658.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;

		int T = Integer.parseInt(br.readLine());

		for (int t = 1; t <= T; t++) {
			st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());
			int K = Integer.parseInt(st.nextToken());

			HashSet<String> hSet = new HashSet<>();

			// 배열에 16진수 숫자 넣기
			String[] str = br.readLine().split("");

			// 단위 만들어놓기
			int cut = N / 4;

			// N/4 회전 시키면서 해시셋에 16진수 넣기
			for (int i = 0; i < cut; i++) {
				// 회전
				String temp = str[str.length - 1];
				for (int j = str.length - 1; j > 0; j--) {
					str[j] = str[j - 1];
				}
				str[0] = temp;

				// 미리 정해놓은 단위로 16진수 만들어서 해시셋에 저장 (중복 거르기)
				for (int j = 0; j <= str.length - cut; j += cut) {
					String hex = "";
					for (int k = j; k < j + cut; k++) {
						hex += str[k];
					}
					hSet.add(hex);
				}
			}
			// 해시셋에서 값 꺼내면서 10진수로 변환해 배열에 저장
			int[] arr = new int[N];
			int idx = 0;
			for (String hexString : hSet) {
				arr[idx++] = Integer.parseInt(hexString, 16);
			}

			// 10진수 저장해놓은 배열 정렬 후 뒤에서 k번째 수 뽑아내기
			Arrays.sort(arr);
			sb.append("#" + t + " " + arr[arr.length - K] + "\n");
		}
		System.out.println(sb);
	}
}

'알고리즘 > SW Expert Academy' 카테고리의 다른 글

[SWEA] 4008 숫자 만들기 JAVA  (0) 2023.10.15
[SWEA] 5656 벽돌 깨기 JAVA  (1) 2023.10.11
[SWEA] 2115 벌꿀채취 JAVA  (1) 2023.10.09
[SWEA] 1952 수영장 JAVA  (0) 2023.10.08
[SWEA] 2117 홈 방범 서비스 JAVA  (0) 2023.10.07