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

문제보기

완탐~!

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

public class Main {

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int t = Integer.parseInt(br.readLine());
    int idx = 1;
    StringBuilder sb = new StringBuilder();
    
    while(t-->0) {
    	// 중복하지 말래서 해쉬셋 썼다 
      HashSet<Integer> set = new HashSet<Integer>();
      StringTokenizer st = new StringTokenizer(br.readLine());
      int n = Integer.parseInt(st.nextToken());
      int k = Integer.parseInt(st.nextToken()) -1;
      // 로테이션 할 횟수는 전체 숫자를 4로 나누면 된다. 
      // 이 이상 로테이션 해봐야 어차피 중복이다 
      int l = n/4;
      String s = br.readLine();

      while(l-- > 0){
				// 스트링을 띄엄띄엄 해가면서 10진수로 바꿔 저장하자
        for(int i = 0 ; i < n ; i += n/4) {
          if( i + n/4 >= n ) {
            // 단, 맨 마지막 숫자의 경우 substring에서 인덱스 예외가 발생
            set.add(Integer.parseInt(s.substring(i), 16));
          }else {
            set.add(Integer.parseInt(s.substring(i, i + n/4), 16));
          }
        }
        // 다 구했다면 이제 스트링을 한칸씩 땡겨주자 
        s = s.substring(n-1) + s.substring(0, n-1);
      }

			// 정렬을 위해 list에 다시 담아본다 
      List<Integer> list = new ArrayList<Integer>(set);
      list.sort(new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
          if(o1 > o2) { // 내림차순으로 정렬하기
            return -1;
          }else return 1;
        }
      });
      // 출력부
     sb.append("#" + idx++ + " " + list.get(k) + "\n");
    }
    System.out.println(sb);
  }
}


Tags:

Categories:

Updated:

Comments