[백준] B2. 트럭 주차 (Python)
❓ 문제
2979번: 트럭 주차
첫째 줄에 문제에서 설명한 주차 요금 A, B, C가 주어진다. (1 ≤ C ≤ B ≤ A ≤ 100) 다음 세 개 줄에는 두 정수가 주어진다. 이 정수는 상근이가 가지고 있는 트럭이 주차장에 도착한 시간과 주차장
www.acmicpc.net
💡 해결하기
이 문제는 시간 자체가 아닌 시간 간격을 기준으로 해결하는 것이 좋다.
문제에서 주어진 첫 번째 예제 입력을 그림으로 그려 분석해 보면 다음과 같다.
1️⃣
우선, 트럭이 가장 마지막으로 트럭이 주차장을 떠난 시간 이전에 일어나는 일들에 주목해야 한다.
2️⃣
1분당 요금이므로 주어진 범위에서 1분 간격으로 시간을 나눈다. 위 그림으로 보아 가장 마지막으로 트럭이 주차장을 떠난 시간이 n이라면 1부터 시작한다면 n-1개의 간격이 나오는 것을 위를 통해 알 수 있으므로 0부터 시작한다면 n개의 간격이 나오는 것도 알 수 있다.
3️⃣
입력받은 트럭이 들어오고 나가는 시간에 따라 해당 트럭이 머문 시간을 기록해 준다. 이때에도 분 간격이 적용된다. 어떤 트럭이 x분부터 y분까지 머물렀다면, 그 트럭은 y-x개의 분 간격 동안 머무른 것이다.
이렇게 기록을 3번 해주면 된다.
4️⃣
마지막으로 각 분 간격에 머문 트럭의 수를 살펴 그에 맞는 요금을 곱해주면 된다. 그렇게 나온 값들을 모두 더하면 구하고자 하는 값이 나온다.
위 문제는 리스트를 이용하여 풀 수 있다.
우선, 트럭이 들어오고 나가는 시간이 항상 오름차순 정렬로 주어지는 것은 아니므로 시간 입력을 모두 받은 후 그 중에서 가장 큰 숫자를 마지막으로 주차장을 떠난 시간으로 정한다.
주차장에 처음으로 도착한 시간도 구할 수는 있지만 그것을 이용하여 범위를 구하게 되면 나중에 인덱싱을 할 때 숫자가 맞지 않아 불편하므로 리스트의 원소의 개수는 마지막으로 주차장을 떠난 시간의 숫자가 된다.
문제에서 입력으로 주어지는 시간은 1부터 100까지라고 하였으므로 굳이 위처럼 하지 않고 길이가 100인 0으로 초기화된 리스트를 만들어 이용해도 된다.
시간 간격의 개수(마지막으로 주차장을 떠난 시간)는 곧 리스트의 길이(원소의 개수)가 되고,
각 트럭이 들어온 시간을 x, 나간 시간을 y라 하면 트럭이 머무는 시간을 시간 간격을 나타낸 리스트에다 기록하려면 range(x, y) 범위에 해야 한다.
리스트의 원소 하나하나는 해당 시간 간격에 있는 트럭의 수가 될 것이다.
총 주차 요금을 구할 때에는 반복문으로 리스트의 각 요소들을 하나씩 탐색하여 각 요소의 숫자와 그에 해당하는 요금을 곱해 그 값들을 계속 누적해 나가면 된다.
💻 Python 코드 작성하기
a, b, c = map(int, input().split()) # 각각 1대, 2대, 3대당 주차 요금
times = [list(map(int, input().split())) for _ in range(3)] # 시간 입력받기(입력은 항상 3줄)
latest = 0 # 가장 마지막으로 트럭이 떠난 시간 구하기 (시간들 중 가장 큰 숫자)
for time in times:
for t in time:
if t > latest:
latest = t
trucks = [0] * latest # 0부터 latest까지의 시간 간격을 나타내는 리스트, 각 요소는 각 시간 간격에 주차된 트럭의 수가 됨.
for time in times:
arrive, leave = time[0], time[1] # 도착한 시간, 떠난 시간
for i in range(arrive, leave): # arrive부터 leave 이전 숫자에 해당하는 인덱스 부분만
trucks[i] += 1 # 주차된 트럭 수 1 증가
charge = 0 # 총 주차 요금 구하기
for truck in trucks:
if truck == 1: # 해당 시간 간격에 트럭이 1대 주차되어 있을 때
charge += a
elif truck == 2: # 2대일 때
charge += 2 * b
elif truck == 3: # 3대일 때 (시간이 0부터 시작하게 코드를 구성하였으므로 truck == 0인 경우도 있기 때문에 else라고 적으면 안되고 truck == 3으로 명시해야 한다.)
charge += 3 * c
print(charge)
🙂 돌아보기
처음에 시간 간격으로 접근해야 한다는 것을 깨닫지 못해서 복잡하게 생각하고 시간을 많이 소요했던 문제였다.