[Softeer] GBC

최동혁·2023년 2월 1일
0

Softeer

목록 보기
7/10

풀이 방법

(길이, 기준 속도)와 (길이, 현재 속도)의 배열을 따로 받는다.
기준 배열과 현재 배열이라고 하겠다.
기준 배열을 먼저 순회하면서 현재 배열과 비교를 할 것이다.
3가지 경우가 있다.
1. 기준 배열의 길이 > 현재 배열의 길이
2. 기준 배열의 길이 < 현재 배열의 길이
3. 기준 배열의 길이 = 현재 배열의 길이

  • 1번째 경우

    • 현재 배열의 길이는 기준 배열의 길이보다 작으므로 기준 배열의 속도와 현재 배열의 속도 값을 비교해서 초과했으면 res에 둘의 차이를, 초과하지 않았으면 res에 0을 append 해준다. (res는 초기에 빈 리스트이다.)
      - 그 후, 현재 배열의 다음 번째 값의 길이와 비교를 한다.
  • 2번째 경우

    • 현재 배열의 길이는 기준 배열의 길이보다 크므로, 일단 속도 먼저 위와 같이 체크해서 res에 값을 넣어주고 기준 배열을 다음 값으로 넘겨준다.
  • 3번째 경우

    • 기준 배열의 길이와 현재 배열의 길이가 같으므로 둘다 같이 넘어가야 한다.

예시

  • 기준 배열의 길이 50이 현재 배열의 길이 60보다 작은 상황.
  • 즉, 2번째 경우이다.
    • 그렇다면 50까지의 기준 속도는 50이여서 26이 초과하였기 때문에, res에 26을 집어넣어준다.
    • 그리고 기준 배열의 다음 값으로 넘어가준다.
    • 현재 배열의 길이는 60에서 50을 뺀 10으로 업데이트를 해준다.
  • 기준 배열의 2번째 길이 40은 현재 배열의 길이 10보다 크다.
  • 즉, 1번째 경우이다.
    • 기준 배열의 속도는 40인데 현재 배열의 속도는 76이기 때문에 36만큼 초과해서 res에 36을 집어 넣어준다.
    • 그리고 기준 배열의 길이는 40에서 10을 뺀 30으로 업데이트를 해주고, 현재 배열은 다음 배열의 값인 길이 18로 넘어가준다.

과정

  • 처음
    • 기준 배열 [(50, 50), (40, 40), (10, 30)]
    • 현재 배열 [(60, 76), (18, 28), (22, 50)]
    • res []
  • 1
    • 기준 배열 [(0, 50), (40, 40), (10, 30)]
    • 현재 배열 [(10, 76), (18, 28), (22, 50)]
    • res [26]
      • 기준 50에서 26만큼 초과했기 때문
  • 2
    • 기준 배열 [(0, 50), (30, 40), (10, 30)]
    • 현재 배열 [(0, 76), (18, 28), (22, 50)]
    • res [26, 36]
      • 기준 40에서 36만큼 초과
  • 3
    • 기준 배열 [(0, 50), (12, 40), (10, 30)]
    • 현재 배열 [(0, 76), (0, 28), (22, 50)]
    • res [26, 36, 0]
      • 기준 속도 잘 지킴. 0으로 넣어줌. -는 필요 없기 때문
  • 4
    • 기준 배열 [(0, 50), (0, 40), (10, 30)]
    • 현재 배열 [(0, 76), (0, 28), (10, 50)]
    • res [26, 36, 0, 10]
      • 기준 40에서 10만큼 초과
  • 5
    • 기준 배열 [(0, 50), (0, 40), (0, 30)]
    • 현재 배열 [(0, 76), (0, 28), (0, 50)]
    • res [26, 36, 0, 10, 20]
      • 기준 30에서 20만큼 초과

풀이 코드

import sys

n, m = map(int, sys.stdin.readline().split())

limit = []
base = []

for i in range(n):
    limit.append(list(map(int, sys.stdin.readline().split())))

for j in range(m):
    base.append(list(map(int, sys.stdin.readline().split())))

i = 0
res = []
for leng, ver in limit:
    while i < len(base):
        if leng > base[i][0]:
            leng -= base[i][0]
            if ver >= base[i][1]:
                res.append(0)
            else:
                res.append(base[i][1] - ver)
            i += 1
        elif leng < base[i][0]:
            base[i][0] -= leng
            if ver >= base[i][1]:
                res.append(0)
                break
            else:
                res.append(base[i][1] - ver)
                break
        else:
            if ver >= base[i][1]:
                res.append(0)
            else:
                res.append(base[i][1] - ver)
            i += 1
            break
print(max(res))
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글