1 minute read

문제 탐색하기

  • 각 타일의 예쁨 정도 배열이 정수로 들어온다.
    •  NAB(1 ≤ NAB ≤ 2000, 2 × B + A ≥ N)
  • 각 타일의 예쁨은 1,000,000 이하의 양의 정수이다.

  • 정답으로 가능한 최대 값은 2000 Χ 1,000,000 = 2,000,000,000 으로 정수 범위 이내이다.

코드 설계하기

구현 방법

  • A 타일 입력과 B 타일 입력을 각각 정렬을 수행한다.
    • N이 홀수인 경우 반드시 2 Χ 1 타일을 사용하게 되므로, A 타일을 우선적으로 사용한 후 나머지 타일 배치를 수행한다.
  • 각 타일에 의해 정답으로 더해질 수 있는 후보값을 계산한다.
    • 둘 중 큰 값을 정답 값 더해준다.
    • N의 길이를 2만큼 줄인 후 동일 연산을 수행한다.
    • N이 0이 될 때까지 반복한다.
  • 매 순간에 대해 최적 해를 구한다. => Greedy Algorithm

시간 복잡도

  • 정렬에 의한 복잡도가 O(A log A), O(B log B) 이므로 O(N log N)에 근접한다.
    • N 최댓값이 2,000이므로 약 22,000 정도이며, 시간 내 풀이가 가능하다.

정답 코드 (Java)

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.Arrays;  
import java.util.StringTokenizer;  
  
public class b18230 {  
    private static int N, A, B, answer;  
    private static int[] tile_A;  
    private static int[] tile_B;  
  
    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        StringTokenizer st = new StringTokenizer(br.readLine());  
        N = Integer.parseInt(st.nextToken());  
        A = Integer.parseInt(st.nextToken());  
        B = Integer.parseInt(st.nextToken());  
        tile_A = new int[A];  
        tile_B = new int[B];  
  
        st = new StringTokenizer(br.readLine());  
        for (int i = 0; i < A; i++) {  
            tile_A[i] = Integer.parseInt(st.nextToken());  
        }  
  
        st = new StringTokenizer(br.readLine());  
        for (int i = 0; i < B; i++) {  
            tile_B[i] = Integer.parseInt(st.nextToken());  
        }  
  
        // 정렬 수행  
        Arrays.sort(tile_A);  
        Arrays.sort(tile_B);  
  
  
        // 값이 홀수인 경우, A 타일을 우선적으로 사용 후 남은 타일을 배치한다.  
        int a_i = A - 1, b_i = B - 1;  
        if (N % 2 != 0) {  
            answer += tile_A[a_i--];  
            N--;  
        }  
  
        while (N != 0) {  
            int tmpA = 0, tmpB = 0;  
  
            // 배치 가능 여부를 확인 후,  
            // A 타일의 value와 B 타일의 value를 계산한다.  
            if (a_i >= 1){  
                tmpA = tile_A[a_i] + tile_A[a_i - 1];  
            }  
            if (b_i >= 0){  
                tmpB = tile_B[b_i];  
            }  
  
            if (tmpA >= tmpB){  
                answer += tmpA;  
                a_i -= 2;  
            }else {  
                answer += tmpB;  
                b_i--;  
            }  
  
            N -= 2;  
        }  
  
        System.out.println(answer);  
  
    }  
}

Leave a comment