본문 바로가기

알고리즘/SWEA

SWEA [모의 SW 역량테스트] 보물상자 비밀번호

728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo&categoryId=AWXRUN9KfZ8DFAUo&categoryType=CODE

 

SW Expert Academy

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

swexpertacademy.com

각 변에 다음과 같이 16진수 숫자(0~F)가 적혀 있는 보물상자가 있다.

보물 상자의 뚜껑은 시계방향으로 돌릴 수 있고, 한 번 돌릴 때마다 숫자가 시계방향으로 한 칸씩 회전한다.

 

각 변에는 동일한 개수의 숫자가 있고, 시계방향 순으로 높은 자리 숫자에 해당하며 하나의 수를 나타낸다.

예를 들어 [Fig.1]의 수는 1A3, B54, 8F9, D66이고, [Fig.2]의 수는 61A, 3B5, 48F, 9D6이다.

보물상자에는 자물쇠가 걸려있는데, 이 자물쇠의 비밀번호는 보물 상자에 적힌 숫자로 만들 수 있는 모든 수 중, K번째로 큰 수를 10진 수로 만든 수이다.

N개의 숫자가 입력으로 주어졌을 때, 보물상자의 비밀 번호를 출력하는 프로그램을 만들어보자.

(서로 다른 회전 횟수에서 동일한 수가 중복으로 생성될 수 있다. 크기 순서를 셀 때 같은 수를 중복으로 세지 않도록 주의한다.)

 

 

보물상자의 비밀번호를 길이가 N인 Char 배열에 저장하고

오른쪽으로 한칸 미는 함수를 구현한다.(당연히 맨 오른쪽부터 한칸씩 밀어야된다 맨오른쪽은 맨왼쪽으로)

총 N/4번 밀 수 있고

한번 밀때마다 16진수를 10진수로 바꾸는 xtoInt라는 함수를 호출하고 Set에 넣는다.(중복을 허락하지 않으므로)

그 다음 정렬을 하기 위해 Set를 다시 ArrayList.addAll을 이용하여 ArrayList에 담고 Collections.sort을 이용하여 정렬하면 끝

 

매우 간단한 구현 문제였다.

 

 

package swea;

import java.util.*;
import java.io.*;

public class 보물상자비밀번호 {
	public static class MyScanner {
		BufferedReader bf;
		StringTokenizer st;

		MyScanner() {
			bf = new BufferedReader(new InputStreamReader(System.in));
		}

		String next() {
			while (st == null || !st.hasMoreTokens()) {
				try {
					st = new StringTokenizer(bf.readLine());
				} catch (Exception e) {
					e.printStackTrace();
				}

			}
			return st.nextToken();
		}

		public int nextInt() {
			return Integer.parseInt(next());
		}

		public long nextLong() {
			return Long.parseLong(next());
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyScanner sc = new MyScanner();
		int T = sc.nextInt();
		StringBuilder sb = new StringBuilder();
		for (int tc = 1; tc <= T; tc++) {

			int answer = 0;

			int N = sc.nextInt();
			int K = sc.nextInt();
			char cmap[] = new char[N];

			cmap = sc.next().toCharArray();

			Set<Integer> s = new HashSet<Integer>();
			for (int i = 0; i <= N / 4; i++) {
				for (int j = 0; j < 4; j++) {
					s.add(xtoInt(cmap, N / 4 * j, N / 4 * (j + 1) - 1));

				}
				char temp = cmap[N - 1];

				for (int j = N - 1; j >= 1; j--) {
					cmap[j] = cmap[j - 1];
				}

				cmap[0] = temp;

			}
			ArrayList<Integer> arr = new ArrayList<Integer>();
			arr.addAll(s);
			Collections.sort(arr, new Comparator<Integer>() {

				@Override
				public int compare(Integer o1, Integer o2) {

					return -(o1 - o2);
				}

			});

			answer = arr.get(K - 1);
			sb.append("#").append(tc).append(" ").append(answer).append("\n");
		}
		System.out.println(sb.toString());
	}

	static int xtoInt(char[] cmap, int left, int right) {
		int r = 1;
		int sum = 0;

		for (int i = right; i >= left; i--) {
			if (cmap[i] >= 'A' && cmap[i] <= 'F') {
				sum += r * (cmap[i] - 'A' + 10);
			} else {
				sum += r * (cmap[i] - '0');
			}
			r *= 16;
		}
		return sum;
	}
}

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

swea 9843 촛불 이벤트  (0) 2020.05.23
SWEA [모의 SW 역량테스트] 등산로 조성  (0) 2020.05.01