백준 1092번 배 파이썬

박슬빈·2021년 9월 11일
0

알고리즘

목록 보기
11/40

문제

입력 , 출력

solution

import sys

input = sys.stdin.readline

n = int(input())
crain = list(map(int, input().split()))

m = int(input())
weight = list(map(int, input().split()))
weight.sort(reverse=True)
crain.sort(reverse=True)
time = 0
if max(weight) > max(crain):
    print(-1)
else:
    while weight:
        for i in range(n):
            for j in range(len(weight)):
                if crain[i] >= weight[j]:
                    del weight[j]
                    break
        time += 1
    print(time)

설명

처음엔 크레인 입력 받는 부분이 정렬되어 입력 받는줄 알아서 조금 문제가 있었던것 같다.
우선 입력을 받고 weight , crain 을 내림차순으로 정렬을 한다.
내림차순으로 정렬하는 이유은 큰 무게부터 없애기 위해서 이다.
그리고 weight의 최대무게가 crain의 최대 무게보다 클 경우에는 모두 못 옮기기 때문에 -1을 출력
아닐경우에는 weight가 빈 배열이 아닐경우 while 문을 돌려서
첫번째 for문은 크레인이 들수있는 최대무게 crain[i] 를 하기위해서
두번째 for문은 상자의 무게 weight[j] 를 얻기 위해서
크레인이 들수있는 무게보다 상자의 무게가 작거나 같을경우에는 del를 사용해서
weight에서 삭제해주고 break를 사용해서 두번째 for문을 빠져나간다
그리고 첫번재 for문이 끝나면 크레인을 모두 한번씩 사용했기때문에 time에 1을 더해준다

후기

접근은 맞았는데 sort부분이 틀렸었고 , del가 있는지 몰라서
배열을 한개 만들어서 not in 을 사용해서 체크를 하니 시간초과가 났다.
del문을 사용하니 이미 옮긴 상자는 체크를 하지 않으니 시간복잡도가 엄청 줄고
배열을 한개 만들어서 not in 을 사용하니 이미 옮겼던 상자들도 계속 체크를 하기때문에 시간이 엄청 오래걸렸었다

함수를 더 많이 알아야겠다...

profile
이것저것합니다

0개의 댓글