코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/SWEA

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

2023. 11. 6. 12:28

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

 

SW Expert Academy

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

swexpertacademy.com

 

문제

각 변에 다음과 같이 16진수 숫자(0~F)가 적혀 있는 보물상자가 있다.
보물 상자의 뚜껑은 시계방향으로 돌릴 수 있고, 한 번 돌릴 때마다 숫자가 시계방향으로 한 칸씩 회전한다.

각 변에는 동일한 개수의 숫자가 있고, 시계방향 순으로 높은 자리 숫자에 해당하며 하나의 수를 나타낸다.
예를 들어 [Fig.1]의 수는 1A3, B54, 8F9, D66이고, [Fig.2]의 수는 61A, 3B5, 48F, 9D6이다.
보물상자에는 자물쇠가 걸려있는데, 이 자물쇠의 비밀번호는 보물 상자에 적힌 숫자로 만들 수 있는 모든 수 중, K번째로 큰 수를 10진 수로 만든 수이다.
N개의 숫자가 입력으로 주어졌을 때, 보물상자의 비밀 번호를 출력하는 프로그램을 만들어보자.
(서로 다른 회전 횟수에서 동일한 수가 중복으로 생성될 수 있다. 크기 순서를 셀 때 같은 수를 중복으로 세지 않도록 주의한다.)

 

입력

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 숫자의 개수 N과 크기 순서 K가 주어 진다.
그 다음 줄에는 16진수 0~F 숫자가 공백 없이 N개 주어진다.

 

출력

출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

 


소스코드

import java.io.*;
import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

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

        for (int i = 0; i < t; i++) {
            st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int k = Integer.parseInt(st.nextToken());
            String nums = br.readLine();

            StringBuilder sb1 = new StringBuilder();
            StringBuilder sb2 = new StringBuilder();
            StringBuilder sb3 = new StringBuilder();
            StringBuilder sb4 = new StringBuilder();
            for (int j = 0; j < n; j++) {
                if(j < n/4 * 1) sb1.append(nums.charAt(j));
                else if(j < n/4 * 2) sb2.append(nums.charAt(j));
                else if(j < n/4 * 3) sb3.append(nums.charAt(j));
                else if(j < n/4 * 4) sb4.append(nums.charAt(j));
            }

            HashSet<Integer> set = new HashSet<>();
            for (int j = 0; j < n / 4; j++) {
                // 각 면의 16진수 값 저장
                set.add(Integer.parseInt(sb1.toString(), 16));
                set.add(Integer.parseInt(sb2.toString(), 16));
                set.add(Integer.parseInt(sb3.toString(), 16));
                set.add(Integer.parseInt(sb4.toString(), 16));

                // Lotate start
                
                String s1 = sb1.charAt(sb1.length() - 1) + "";
                String s2 = sb2.charAt(sb2.length() - 1) + "";
                String s3 = sb3.charAt(sb3.length() - 1) + "";
                String s4 = sb4.charAt(sb4.length() - 1) + "";

                // delete
                sb1.deleteCharAt(sb1.length() - 1);
                sb2.deleteCharAt(sb2.length() - 1);
                sb3.deleteCharAt(sb3.length() - 1);
                sb4.deleteCharAt(sb4.length() - 1);

                // reverse
                sb1 = sb1.reverse();
                sb2 = sb2.reverse();
                sb3 = sb3.reverse();
                sb4 = sb4.reverse();

                // append
                sb1.append(s4);
                sb2.append(s1);
                sb3.append(s2);
                sb4.append(s3);

                // reverse
                sb1 = sb1.reverse();
                sb2 = sb2.reverse();
                sb3 = sb3.reverse();
                sb4 = sb4.reverse();
                
                // Lotate end
            }

            List<Integer> list = set.stream().collect(Collectors.toList());
            Collections.sort(list, Collections.reverseOrder());

            sb.append("#" + (i + 1) + " " + list.get(k - 1) + "\n");
        }
        System.out.println(sb);
    }
}

 

해결 방법

  1. 보물상자의 각 변에 있는 수를 각각 StringBuilder에 저장한다.
  2. StringBuilder에 저장된 수를 10진수로 변환하여 HashSet에 저장한다.
  3. Lotate 한다. Stringbuilder 끼리 값을 교환한다.
  4. 2, 3번의 과정을 반복한다.

'알고리즘 > SWEA' 카테고리의 다른 글

[SWEA] 1953번 : 탈주범 검거  (0) 2023.11.08
[SWEA] 1949번 : 등산로 조성  (1) 2023.11.06
[SWEA] 16800번 : 구구단 걷기  (0) 2023.11.05
[SWEA] 4615번 : 재미있는 오셀로 게임  (0) 2023.11.05
[SWEA] 8016번 : 홀수 피라미드  (0) 2023.11.03
    '알고리즘/SWEA' 카테고리의 다른 글
    • [SWEA] 1953번 : 탈주범 검거
    • [SWEA] 1949번 : 등산로 조성
    • [SWEA] 16800번 : 구구단 걷기
    • [SWEA] 4615번 : 재미있는 오셀로 게임
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바