구현(과일노리/S5)
1. 문제
재훈이는 과일노리에서 영화를 보는 걸 좋아한다. 하지만 어느 날, 사이버안전지킴이 병희가 만든 학인봇이 나타나 과일노리로의 접속을 차단하기 시작했다. 학인봇은 트래픽이 오가는 길목에 일정 간격으로 나타나 수 초간 침입자를 탐지한다. 영화가 너무 보고 싶은 재훈이는 학인봇을 피해 과일노리에 접속하려고 한다.
아래의 예시를 보자.
재훈이는 과일노리에 접속하기 위해 총 4개의 구간을 거쳐야 한다. A/B는 해당 구간에서 학인봇이 A초 간격으로 나타나, B초 동안 침입자를 탐지하고 사라진다는 의미이다. 학인봇은 침입자 발생과 동시에 모든 구간에서 한꺼번에 나타나 활동을 시작한다. 따라서 재훈이는 학인봇의 감시를 피해 경로 중간의 네트워크 장비에 숨으면서 이동해야한다. 각 구간을 통과하는 데에는 1초의 시간이 소요된다. 다음은 예시에 대한 설명이다.
- 재훈이의 핸드폰에서, 0초의 시간이 소요된 상태에서, 학인봇이 나타났기 때문에 재훈이는 5초간 기다린 후에 다음 구간으로 이동해야한다.
- 첫 번째 스위치에서, 6초의 시간이 소요된 상태에서, 학인봇의 쉬는 시간이기 때문에 재훈이는 기다리지 않고 바로 이동할 수 있다.
- 두 번째 라우터에서, 7초의 시간이 소요된 상태에서, 학인봇의 활동이 2초 남았기 때문에 재훈이는 2초 기다린 후에 이동해야 한다.
- 세 번째 서버에서, 10초의 시간이 소요된 상태에서, 학인봇의 활동이 4초 남았기 때문에 재훈이는 4초 기다린 후에 이동해야 한다.
예시에서 재훈이가 과일노리에 접속하는 데에는 최소 15초의 시간이 소요되었다.
심술쟁이 해커 임준오(동탄 주민)는 재훈이를 경찰에 신고해서 윤리의식을 일깨워주려 한다. 준오가 112에 전화를 거는 동안 재훈이의 최소접속시간을 구해서 준오에게 알려주자!
2. 입력
첫째 줄에 재훈이가 거쳐야하는 구간의 수 N이 주어진다. (1 ≤ N ≤ 50,000)
이후 N개의 줄에 걸쳐 i번째 구간에서의 학인봇의 활동 정보 (a, b)가 주어진다. 이는 학인봇이 a초 간격으로 나타나, b초 동안 활동 후에 사라진다는 뜻이다. (1 ≤ a, b ≤ 1,000)
4
3 5
4 1
3 3
6 4
3
10 1
10 2
10 3
3. 출력
재훈이가 과일노리에 접속하기 위해 필요한 최소 소요시간을 출력한다.
15
4
4. 코드
import sys
n = int(sys.stdin.readline().strip())
botList =[list(map(int, sys.stdin.readline().strip().split())) for _ in range(n)]
# 초기값
result = botList[0][1] + 1
for i in range(1,n):
# 학인봇 활동시간
if result % sum(botList[i]) < botList[i][1]:
result += botList[i][1] - (result % sum(botList[i])) + 1
# 학인봇 쉬는시간
else:
result += 1
print(result)
5. 풀이설명
① 학원봇이 처음 활동시간 +1 을 초기 결과값에 대입한다.
② 결과값을 학원봇의 활동시간 + 쉬는 시간을 나눈 나머지가 활동시간보다 작으면 활동시간이라 판단하고 결과값에 활동시간+조건문에서 나온 나머지+이동시간 1 만큼 추가한다.
③ 결과값을 학원봇의 활동시간 + 쉬는 시간을 나눈 나머지가 활동시간보다 크면 쉬는시간이라 판단하고 결과값에 이동시간 1을 추가한다.
④ 결과값을 출력한다.
6. 느낀점
학원봇의 활동시간과 쉬는시간의 조건을 먼저 생각하고 문제를 접근하는 것이 중요하다.