문제 풀이 (JAVA)

import java.util.*;
public class part4_5 {

	public static void main(String[] args){
		// K번째 큰 수
		Scanner input = new Scanner(System.in);
		
		int N = input.nextInt();
		int K = input.nextInt();
		
		int [] a = new int[N];
		
		for(int i=0; i<N; i++) {
			a[i] = input.nextInt();
		}
		int answer = solution(a,N,K);
		System.out.print(answer);
		
	}
	private static int solution(int [] a , int N, int K) {
		int result = -1;
		int sum=0;
		TreeSet<Integer> set = new TreeSet<>(Collections.reverseOrder());
		for(int i=0; i<N-2; i++) {
			for(int j=i+1; j<N-1; j++) {
				for(int k=j+1; k<N; k++) {
					sum = a[i] + a[j] + a[k];
					set.add(sum);
				}
			}
		}
		int cnt=0;
		for(int x : set) {
			cnt++;
			if(cnt==K) {
				result = x;
				break;
			}
		}	
		return result;
	}
}

TreeSet 주요 함수 정리

set.add(val) : 중복되지 않는 val 값을 set에 저장한다.

new TreeSet<>(Collections.reverseOrder()) : 값을 저장시 내림차순 정렬한다. 기본적으로는 오름차순으로 저장한다.

set.first() : set에 저장된 첫번째 값을 가져온다.

set.last() : set에 저장된 마지막 값을 가져온다.

set.size() : set의 사이즈를 반환한다.

for( int x : set) {} : for문을 사용하여 set 값을 가져온다.

 

주요 핵심 포인트

1. TreeSet의 내림차순 정렬을 이용하여 저장시 내림차순으로 저장되도록 하였다.

2. TreeSet은 중복값을 허용하지 않으므로 동일한 값이 들어올시 저장하지 않는다.

개선해야할 사항

1. 문제의 N 값이 100까지인것을 생각하여 투포인터와 슬라이딩윈도우를 쓸지, for문을 쓸지 잘 결정하는 것이 문제의 핵심포인트인듯 하다. 다음부터는 효율성을 고려하는 문제인지, 단순히 for문 로직을 구현하는 문제인지 빠르게 파악하도록 하자.

+ Recent posts