[BOJ-#1092] 배

신지·2023년 8월 3일
0

BOJ

목록 보기
7/15
post-thumbnail

문제

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

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

입력

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

출력

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


Code

Github 링크

import sys

input = sys.stdin.readline

crane = int(input().rstrip())
cranes = list(map(int, input().rstrip().split()))
box = int(input().rstrip())
boxes = list(map(int, input().rstrip().split()))
cnt = 0

cranes.sort(reverse=True)
boxes.sort(reverse=True)

if max(cranes) < max(boxes) :
    print(-1)
else :
    while boxes :
        cnt += 1
        for i in range(len(cranes)) :
            # 원래 이 부분을 그냥 box로 넣었는데, 그럼 box에서 pop한 갯수를 카운트하지 못해서 인덱스 에러남
            for j in range(len(boxes)) :
                if cranes[i] >= boxes[j] :
                    boxes.pop(j)
                    break

    print(cnt)

코드 설명

import sys

input = sys.stdin.readline

crane = int(input().rstrip())
cranes = list(map(int, input().rstrip().split()))
box = int(input().rstrip())
boxes = list(map(int, input().rstrip().split()))
cnt = 0

cranes.sort(reverse=True)
boxes.sort(reverse=True)

빠른 입력을 받을 수 있도록 input을 선언하고 크레인의 개수, 무게, 박스의 개수, 박스의 무게를 받는다. 박스와 크레인 모두 내림차순으로 정렬한다.


if max(cranes) < max(boxes) :
    print(-1)
else :
    while boxes :
        cnt += 1
        for i in range(len(cranes)) :
            # 원래 이 부분을 그냥 box로 넣었는데, 그럼 box에서 pop한 갯수를 카운트하지 못해서 인덱스 에러남
            for j in range(len(boxes)) :
                if cranes[i] >= boxes[j] :
                    boxes.pop(j)
                    break

    print(cnt)

만약 박스의 최대 무게가 크레인의 최대 무게보다 크다면 -1을 출력한다.

그렇지 않다면 박스가 비어있지 않는 한 계속해서 2중 for문을 돌리며 횟수를 카운트한다. 이때, 처음에는 for문 안에 range를 그냥 crane과 box로 넣었다. 크레인의 경우 문제 없었지만 박스의 경우 계속해서 pop하기 때문에 indexError가 났다. 때문에 boxes의 개수를 통해 (그냥 보기 예쁘라고 크레인도 통일해 줬다) 크레인의 무게가 더 크다면 pop 후 break 하고, 작다면 다음 인덱스로 넘어가 더 작은 박스는 들 수 있는지 확인하는 과정을 반복해줬다.


리뷰

많이 틀리긴 했지만... 그건 바보처럼 if문 밖에 print 넣어서 그런 거였고... 저번 주처럼 어려운 브론즈 문제 풀면 짜증나지만 오늘처럼 운 좋게 쉬운 골드 문제 풀면 기분이 너무 좋다 ^__^

처음에 풀이할 때는 무조건 뒤에서부터 오고 크레인 무게가 더 작으면 break를 걸어서 틀렸는데, 2중 for문을 이용해서 크레인 무게가 작을 경우 더 뒤 인덱스에 있는 boxes 중 들 수 있는 박스가 있는지 찾는 코드를 통해 해결했다.

0개의 댓글