문제

https://school.programmers.co.kr/learn/courses/30/lessons/42895


풀이

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
    	
    	// 1억 = 100,000,000 = Math.pow(10, 8);
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	int N = Integer.parseInt(st.nextToken());
    	int K = Integer.parseInt(st.nextToken());
    	
    	int[][] soldiers = new int[N][3];
    	int[] powers = new int[N];
    	int[] speeds = new int[N];
    	int[] intels = new int[N];
    	for (int i=0; i<N; i++) {
    		st = new StringTokenizer(br.readLine());
    		soldiers[i][0] = Integer.parseInt(st.nextToken());
    		soldiers[i][1] = Integer.parseInt(st.nextToken());
    		soldiers[i][2] = Integer.parseInt(st.nextToken());
    		powers[i] = soldiers[i][0];
    		speeds[i] = soldiers[i][1];
    		intels[i] = soldiers[i][2];
    	}
    	
    	Arrays.sort(powers);
    	Arrays.sort(speeds);
    	Arrays.sort(intels);
    	
    	int ans = Integer.MAX_VALUE;
    	for (int power : powers) {
    		if (power <= ans) {
    			for (int speed : speeds) {
    				if (power+speed <= ans) {
    					outer: for (int intel : intels) {
    						if (power+speed+intel <= ans) {
    							int cnt = 0;
    							for (int[] soldier : soldiers) {
    								if (power >= soldier[0] && speed >= soldier[1] && intel >= soldier[2]) {
    									cnt++;
    									if (cnt == K) {
    										ans = Math.min(ans, power+speed+intel);
    										break outer;
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	
    	System.out.print(ans);
    }
    
};


배운 점

  • 시간 복잡도 줄이는 아이디어를 떠올리는데 애먹은 문제였다.
  • 완전히 완전탐색하면 1,000,000 ** 3 이어서 시간초과 날 것이 뻔하고, 최대, 최소 범위로 제한해서 약간 최적화하는 것도 소용 없을 것 같지만 달리 방도가 떠오르지 않았다.
  • array에 값을 담고 정렬해서 array의 요소만을 대상으로 완전탐색하면 된다!


Leave a comment