하루에 한 문제

[모의 SW 역량테스트] 보물상자 비밀번호 -Java 본문

알고리즘/SW Expert Academy

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

dkwjdi 2020. 12. 31. 16:19

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

 

SW Expert Academy

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

swexpertacademy.com

package SW_Expert_Academy;

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.Set;
import java.util.StringTokenizer;

public class 보물상자비밀번호 {
	static int N,K;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int T=Integer.parseInt(br.readLine());
		
		for(int tc=1; tc<=T; tc++) {
			StringTokenizer st= new StringTokenizer(br.readLine());
			N=Integer.parseInt(st.nextToken());
			K=Integer.parseInt(st.nextToken());
			
			Set <String> set = new HashSet<>();
			String number=br.readLine();
			int size=N/4;
			
			for(int i=0; i<size; i++) { //회전 수
				int begin=0;
				int end=size;
				for(int j=0; j<4; j++) { //잘라내는 숫자 
					//System.out.println(number.substring(begin, end));
					set.add(number.substring(begin, end));
					begin+=size;
					end+=size;
				}
				//number 오른쪽으로 한칸씩 이동 
				number=number.substring(number.length()-1,number.length())+number.substring(0,number.length()-1);
				
			}
			List<String> list = new ArrayList<>(set);
			Collections.sort(list, Collections.reverseOrder());
			sb.append("#"+tc+" "+Integer.parseInt(list.get(K-1),16)+"\n");
			
		}
		System.out.println(sb);
	}

}

 

소요시간 : 30분 

 

예전에 풀었을 때는 number를 배열로 만들어서... 하나하나씩 배열인덱스를 옮겨가면서 풀어서 시간이 좀 오래 걸렸는데 이제는 String다루는 실력이 많이 늘어서 금방풀었습니다!

 

로직을 살펴보면

 

1. 회전 

회전의 수는 정해져있습니다. 만약 number의 길이가 12라면

4개의 변에 각각 3개의 숫자가 들어갑니다. (12/4=3) 

즉 한변의 숫자가 3개니까 3회전을 하면 원래와 같아진다는 소리입니다.  

-> N/4 = 회전의 수 

회전을 할 때는 substring을 이용해서 만들어주었습니다.

 

2. 숫자 잘라내기

숫자를 잘라낼때는 총 변의 수가 4이기 떄문에 4번 for문을 돌아줍니다.

그리고 그 안에서 또다시 substring을 통해 잘라줍니다.

이렇게 자른 숫자를 set안에 넣어서 중복체크를 해줍니다.

 

이렇게 하고 난 뒤 , set을 list로 바꿔주고 list를 정렬해서 K-1번째 값을 뽑아서 16진수로 변환시켜주면 끝입니다!

 

 

Comments