[시뮬레이션] 5658. 보물상자 비밀번호 (Java)

안수진·2024년 9월 6일

SWEA

목록 보기
16/17
post-thumbnail

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

📌 풀이 과정

N은 4의 배수로 주어지므로, 문자열 개수 = N / 4 이고
해당 문자열 갯수 만큼 회전을 돌리면 처음 주어진 상태로 돌아오는 것을 파악하면 된다.

따라서 0 ~ N/4번 회전을 돌리면, 적혀진 수로 만들 수 있는 모든 숫자들을 구할 수 있다.

주의할 점

같은 숫자일 경우 중복 제거하기

4개의 변에서 숫자 추출

문자열의 회전 효과를 주기 위해 rotateIdx로 각 회전의 시작 인덱스를 관리한다.

for(int i = 0; i < window; i++) {
      int rotateIdx = i;
      
      ...
}

각 변에 대해 숫자를 추출한다. 4개의 변에 대해 각 회전에서 추출한 숫자를 관리한다.

start, end 인덱스 모두 원형 배열처럼 문자열을 순환할 수 있도록 한다.

  • start < end
    문자열이 끝까지 도달하지 않고 순차적으로 처리할 수 있는 경우
    substring(start, end)로 변의 값을 가져 온다.

  • start < end
    원형 배열처럼 시작과 끝이 이어지는 경우
    substring(start)로 문자열 끝까지의 부분을 가져오고, 이어서 substring(0, end)로 처음 부분을 가져온다.

for(int i = 0; i < window; i++) {
      int rotateIdx = i;

      for(int j = 0; j < 4; j++) { // 4번
            int start = (rotateIdx + j * window) % N;
            int end = (start + window) % N;

            String hex;

           	if(start < end){
                hex = input.substring(start, end);
            }
            else{
               hex = input.substring(start) + input.substring(0, end);
           }
           int num = Integer.parseInt(hex, 16);
           if(!list.contains(num)) list.add(num);
      
      }
}

✨ 제출 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.StringTokenizer;

public class Solution {


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for(int t = 1; t <= T; t++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken()); // 숫자의 개수
            int K = Integer.parseInt(st.nextToken()); // K번째로 큰 수
            String input = br.readLine();

            int window = N / 4; // 각 변에는 동일한 개수의 숫자
            List<Integer> list = new ArrayList<>();

            for(int i = 0; i < window; i++) { // N/4 만큼 회전하기
                int rotateIdx = i;

                for(int j = 0; j < 4; j++) { // 4개의 변 숫자 추출하기
                    int start = (rotateIdx + j * window) % N;
                    int end = (start + window) % N;

                    String hex;

                    if(start < end){
                        hex = input.substring(start, end);
                    }
                    else{
                        hex = input.substring(start) + input.substring(0, end);
                    }
                    int num = Integer.parseInt(hex, 16);
                    if(!list.contains(num)) list.add(num);
                }
            }

            Collections.sort(list, Collections.reverseOrder());
            System.out.println("#" + t + " " + list.get(K-1));
        }
    }
}

Reference

보물상자 비밀번호 [SWEA 5658][JAVA][모의 SW 역량테스트]
출처: https://toastfactory.tistory.com/199 [이삭이의 토스트 공장:티스토리]

[SWEA] 5658. 보물상자 비밀번호 (자바 JAVA)

profile
항상 궁금해하기

0개의 댓글