2 분 소요

1. 문제

https://www.acmicpc.net/problem/1092

  • 그리디 문제
// 문제
지민이는 항구에서 일한다. 그리고 화물을 배에 실어야 한다.
모든 화물은 박스에 안에 넣어져 있다.
항구에는 크레인이 N대 있고, 1분에 박스를 하나씩 배에 실을  있다.
모든 크레인은 동시에 움직인다.

 크레인은 무게 제한이 있다.
 무게 제한보다 무거운 박스는 크레인으로 움직일  없다.
모든 박스를 배로 옮기는데 드는 시간의 최솟값을 구하는 프로그램을 작성하시오.

// 입력
첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다.
둘째 줄에는  크레인의 무게 제한이 주어진다.
 값은 1,000,000보다 작거나 같다.
셋째 줄에는 박스의  M이 주어진다.
M은 10,000보다 작거나 같은 자연수이다.
넷째 줄에는  박스의 무게가 주어진다.
 값도 1,000,000보다 작거나 같은 자연수이다.

// 출력
첫째 줄에 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 출력한다.
만약 모든 박스를 배로 옮길  없으면 -1 출력한다.

// 예제 입력 1
3
6 8 9
5
2 5 2 4 7

// 예제 출력 1
2

// 예제 입력 2
2
19 20
7
14 12 16 19 16 1 5

// 예제 출력 2
4

// 예제 입력 3
4
23 32 25 28
10
5 27 10 16 24 20 2 32 18 7

// 예제 출력 3
3

// 예제 입력 4
10
11 17 5 2 20 7 5 5 20 7
5
18 18 15 15 17

// 예제 출력 4
2


2. 핵심 아이디어

  • 박스를 무게 기준으로 내림차순 정렬한 뒤에, 무거운 것부터 옮기도록 함
  • 시간 복잡도 O(NM)에 문제를 해결할 수 있음
  • 크레인과 박스를 내림차순 정렬
  • 매 분마다, 모든 크레인에 대하여 옮길 수 있는 박스를 선택하여 옮기도록 함


3. Python 문제풀이

import sys
input = sys.stdin.readline

n = int(input())
cranes = list(map(int, input().split()))
m = int(input())
boxes = list(map(int, input().split()))

# 모든 박스를 옮길 수 없는 경우
if max(cranes) < max(boxes) :
  print(-1)
  sys.exit()

# 각 크레인이 현재 옮겨야 하는 박스의 번호 (0부터 시작)
positions = [0] * n
# 각 박스를 옮겼는지 여부
checked = [False] * m
# 최적의 해를 구해야 하므로, 내림차순 정렬
cranes.sort(reverse = True)
boxes.sort(reverse = True)

result = 0
count = 0

while True :
  # 박스를 다 옮겼다면 종료
  if count == len(boxes) :
    break
  # 모든 크레인에 대하여 각각 처리
  for i in range(n) :
    while positions[i] < len(boxes) :
      # 아직 안 옮긴 박스 중에서, 옮길 수 있는 박스를 만날 때까지 반복
      if not checked[positions[i]] and cranes[i] >= boxes[positions[i]] :
        checked[positions[i]] = True
        positions[i] += 1
        count += 1
        break
      positions[i] += 1
  result += 1

print(result)


4. Java 문제풀이

import java.util.*;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int n = sc.nextInt();
    ArrayList<Integer> cranes = new ArrayList<>();

    for (int i=0; i<n; i++) {
      cranes.add(sc.nextInt());
    }

    Collections.sort(cranes, Collections.reverseOrder());
    int m = sc.nextInt();
    ArrayList<Integer> boxes = new ArrayList<>();

    for(int i=0; i<m; i++) {
      boxes.add(sc.nextInt());
    }

    Collections.sort(boxes, Collections.reverseOrder());

    if (cranes.get(0) < boxes.get(0)) System.out.println("-1");
    else {
      int result = 0;
      while (!boxes.isEmpty()) {
        int idx = 0;
        for (int i=0; i<cranes.size();) {
          if (idx == boxes.size()) break;
          else if (cranes.get(i) >= boxes.get(idx)) {
            boxes.remove(idx);
            i++;
          }
          else idx++;
        }
        result++;
      }
      System.out.println(result);
    }
  }
}

댓글남기기