어흥

[SWEA 5658] 보물상자 비밀번호 (Java) 본문

알고리즘/SWEA

[SWEA 5658] 보물상자 비밀번호 (Java)

라이언납시오 2020. 4. 29. 13:23
728x90
반응형

문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo

 

SW Expert Academy

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

swexpertacademy.com

1. 주의할 점

- 회전의 수가 최대 3번이 아니다

- 회전시, 맨 뒤의 숫자가 맨 앞에 추가되는것

- 숫자가 커질 수 있으므로 Long으로 지정한다

 

2. 구현

- String으로 받은 후, Treeset에 대입하여 중복제거 + 오름차순 정렬로 되도록 설정한다

- Rot() 함수가 회전을 담당한다

- Treeset은 오름차순으로 정렬되어 있으므로, Set.size()-k의 위치에 있는 원소를 출력한다

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;

public class Solution_5658_보물상자비밀번호 {
	static Set<Long> set;
	static String str;

	static void rot() {
		char c = str.charAt(str.length()-1);
		String sub = str.substring(0,str.length()-1);
		str = c+sub;
	}

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int test = Integer.parseInt(br.readLine().trim());
		for (int t = 1; t <= test; t++) {
			set = new TreeSet<Long>();
			int len, k;
			String s = br.readLine();
			StringTokenizer st = new StringTokenizer(s);
			len = Integer.parseInt(st.nextToken());
			k = Integer.parseInt(st.nextToken());
			str = br.readLine().trim();
			for (int i = 0; i <= len/4; i++) {
				int vv=len/4;
				for(int j=0;j<4;j++) {
					String s1=str.substring(j*vv,(j+1)*vv);
					long ll = Long.parseLong(s1,16);
					set.add(ll);
				}
				rot();
			}
			Iterator<Long> itr = set.iterator();
			long l1,ans=0;
			int cnt=0;
			while (itr.hasNext()) {
				l1=itr.next();
				if(cnt==set.size()-k) {
					ans=l1;
					break;
				}
				cnt++;
			}
			System.out.println("#"+t+" "+ans);
		}
	}
}
728x90
반응형
Comments