공부방

TreeSet구현 문제 본문

문법/알고리즘

TreeSet구현 문제

코딩 화이팅 2023. 3. 20. 17:53

https://swexpertacademy.com/main/talk/solvingClub/problemView.do?contestProbId=AWXRUN9KfZ8DFAUo&solveclubId=AYWesuzK3nUDFAQK&problemBoxTitle=4%EC%A3%BC%EC%B0%A8&problemBoxCnt=1&probBoxId=AYb9SljqxWYDFAQ9+

 

SW Expert Academy

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

swexpertacademy.com

package swea;

import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class 보물상자_비밀번호 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for (int Tc = 1; Tc <= T; Tc++) {
			int N = sc.nextInt();// 숫자의 개수
			int K = sc.nextInt();// 크기 순서
			String word = sc.next();// 숫자의 개수만큼 입력되는 문자열
			Set<Integer> set = new TreeSet<>();// 중복을 피하기 위한 집합 저장소,Treeset은 알아서 정렬이 된다고 배웠던 거 같은데 맞는지 아닌지 확인해보장
			
			char[] Word = new char[word.length()];// 문자열의 문자를 하나하나씩 나눠줄 배열
			Word = word.toCharArray();// 문자열의 문자를 배열에 하나씩 넣어준다.
			
			for (int i = 0; i < N / 4; i++) {
				for (int j = 0; j < N/(N/4); j++) {					
					String a="";
						a=new String(Word,j*(N/4),N/4);//String(a,b,c)->a라는 문자배열을
						//b의 인덱스부터 c만큼 뒤로 간 문자열을 생성
						int b=Integer.parseInt(a,16);//a 문자열을 16진수로 변환
						set.add(b);
				}//만약 12면 3개로 4개의 조합을 만들어줘야되기 때문에 N으로 나눈 값을 다시 N으로 나눈다.				
				char c=Word[word.length()-1];
				for (int j = Word.length-1; j >= 1; j--) {
					Word[j]=Word[j-1];
				}//숫자를 뒤로 하나씩 밀어줄 반복문 j는 1 즉 앞에서부터 반복문을 실행하게되면 1인덱스로 바뀐 값이 뒤로 다 바뀌어버리는 상황이 발생한다.
				//따라서 뒤에서부터 하나씩 앞으로 옮겨준다.
				Word[0]=c;
			}//한번씩 자리를 밀 반복
			
			//Treeset 인터페이스에서 하나의 인덱스값을 뽑기 위한 로직
			int tarindex=set.size()-K;//트리셋은 오름차순이기 때문에 K=10이라고하면 10번째로 큰 숫자이기 때문에
			//사이즈에서 K를 빼면 2를 targetindex에 넣어 2번째로 작은 숫자를 뽑는게 목표
			//따라서 목표인덱스 값을 사이즈에서 K만큼 빼면 2가 나오는데 그 값을 일단 타겟인덱스에 저장
			int ind=0;//인덱스 값을 하나씩 더해주면서 타겟 인덱스와 비교할 변수
			int index=0;//답을 정해줄 진짜 인덱스 변수
			Iterator<Integer> iter=set.iterator();
			while (iter.hasNext()) {//iter뒤에 값이 있다면 반복 진행
				int ele=iter.next();//ele에 오름차순한 처음의 값부터 들어간다.
				if (ind==tarindex) {//트리는 위에서 말했듯이 오름차순이기 때문에 targetindex인 2와 같다면 					
					index=ele;
					//정답 index인 변수에 지금의 ele값을 집어놓고 출력하고 break;
					System.out.println("#"+Tc+" "+index);
					break;
				}
				ind++;
			}
		} // 테케만큼 반복
	}
}

느낀점 : 트리셋을 처음 써봐 좀 낯설어 시간이 오래 걸렸지만 간단한 구현 밖에 없었기 때문에 하기 쉬웠다. 트리셋의 특징은 반복을 허용하지 않고 자동으로 정렬이 되어 다음에도 중복이 불가능하고 정렬을 할 문제가 있으면 쓰기 좋을 것 같다. 마지막에 하나의 인덱스 값을 뽑기 위한 로직은 아직 많이 익숙하지 않아 트리셋이 나올 때마다 보면서 익숙해지게 만들어야할 것 같다. 

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

dfs문제  (0) 2023.03.28
n과 m(9)  (0) 2023.03.25
방향벡터, 돌아서 다시 처음으로(순회)  (0) 2023.03.06
처음에 한번 잘못 파고드면 쉬운 문제도 2시간../반복문은 끝까지/약수  (0) 2023.03.04
완전 탐색  (0) 2023.03.04