문제
https://softeer.ai/practice/6270
해설
이 문제는 for 루프와 while 루프를 문제의 의도대로 잘 설계하기만 한다면 어렵지 않게 풀 수 있는 문제이다.
즉 우리가 실제로 엘리베이터를 타고 있다는 것을 상상하고, 각각의 구간과 제한 속도를 for 루프를 통해 하나하나 꺼내고, 그 안에 while 루프를 넣어 테스트 측정 구간을 통해 제한속도 차이를 계산해야 하는데, 여기서 테스트 측정 구간이 끝났을 때 while 루프를 끝내 그 다음 for 루프로 넘어가도록 만들어주고, 만약 테스트 측정 구간이 끝나지 않았을 경우에는 이미 측정한 구간을 제외한 나머지 테스트 측정 구간에서의 제한속도를 계산하도록 while 루프를 통해 다시 돌리도록 해주면 된다.
이를 이제 코드로 작성을 해보자.
import sys
# 각 구간 갯수(N) 그리고 테스트 구간 갯수 (M) 을 저장한다.
N, M = map(int, sys.stdin.readline().split())
# 구간거리/제한속도와 테스트 구간의 거리/제한속도를 받을 리스트를 준비한다.
real = []
test = []
# 구간거리/제한속도를 받는다.
for _ in range(N):
real.append(list(map(int, sys.stdin.readline().split())))
# 테스트 구간거리/속도를 받는다.
for _ in range(M):
test.append(list(map(int, sys.stdin.readline().split())))
가장 먼저 위와 같이 필요한 데이터를 저장할 변수를 준비해주고, 각각의 입력값들을 받아들인다.
# 최대 제한 속도 차이를 구하기 위해 max_tmp 변수를 준비한다.
max_tmp = 0
# 테스트 구간거리를 바꿔주기 위한 변수를 준비한다.
level = 0
# 각각의 구간거리/제한속도를 불러온다.
for real_dist, real_speed in real:
# while 루프를 생성한다. (안에다가 while을 끝내는 조건을 넣어주어야만 한다.)
while True:
# 테스트 구간거리/구간속도를 꺼낸다.
test_dist, test_speed = test[level]
# 현재 테스트 구간속도와 제한속도의 차와 max_tmp 중 최대값으로 max_tmp를 갱신한다.
max_tmp = max(test_speed-real_speed, max_tmp)
# 테스트 구간 거리가 해당 구간거리보다 길 경우
if (test_dist > real_dist):
# 테스트 구간거리에 해당 구간거리를 빼준다.
test[level][0] = test[level][0]-real_dist
# 그리고 해당 구간거리가 이미 지났으므로 while을 끝냄. (그럼 다음 구간거리로 넘어감)
break
# 테스트 구간 거리가 해당 구간보다 짧을 경우
elif (test_dist < real_dist):
# 해당 구간의 거리에 측정거리를 빼준 후
real_dist = real_dist - test_dist
# 다음 테스트 구간으로 넘겨준다. (이 경우 해당 구간은 아직 끝나지 않음.)
level += 1
# 테스트 구간 거리와 해당 구간이 동일할 경우
elif (test_dist == real_dist):
# 테스트 구간 거리에 해당 거리를 빼주고, (0이 됨)
test[level][0] = test[level][0]-real_dist
# 다음 테스트 구간으로 넘어간다.
level += 1
# 해당 구간거리가 이미 지났으므로 while을 끝낸다.
break
# 가장 크게 제한 속도를 넘어간 값을 출력한다.
print(max_tmp)
그리고 나서는 각각의 구간을 for 루프를 통해 지나면서 테스트 측정을 while 루프를 통해 진행한다. 여기서 주의해야 할 점은 각각의 구간을 넘어가는 조건을 잘 구현하는 것이다.
1. 테스트 구간 거리가 주어진 구간보다 클 경우.
속도차를 갱신해주고, 테스트 구간에 해당 구간의 거리를 빼준 값으로 테스트 구간 거리로 갱신해준다.
그리고 while 루프를 계속 진행한다.
2. 테스트 구간 거리와 주어진 구간의 거리가 동일할 경우
속도차를 갱신해주고, 테스트 구간 거리를 다음 구간으로 넘긴 후 (level += 1), while 루프를 끝내 다음 구간으로 넘어가도록 한다.
3. 주어진 구간의 거리가 테스트 구간거리보다 클 경우
속도차를 갱신해주고, 테스트 구간 거리를 다음 구간으로 넘긴다. (level += 1)
이 3가지 조건만 잘 기억한다면 어렵지 않게 위처럼 코드를 작성할 수 있게 된다.
코드
import sys
# 각 구간 갯수(N) 그리고 테스트 구간 갯수 (M) 을 저장한다.
N, M = map(int, sys.stdin.readline().split())
# 구간거리/제한속도와 테스트 구간의 거리/제한속도를 받을 리스트를 준비한다.
real = []
test = []
# 구간거리/제한속도를 받는다.
for _ in range(N):
real.append(list(map(int, sys.stdin.readline().split())))
# 테스트 구간거리/속도를 받는다.
for _ in range(M):
test.append(list(map(int, sys.stdin.readline().split())))
# 최대 제한 속도 차이를 구하기 위해 max_tmp 변수를 준비한다.
max_tmp = 0
# 테스트 구간거리를 바꿔주기 위한 변수를 준비한다.
level = 0
# 각각의 구간거리/제한속도를 불러온다.
for real_dist, real_speed in real:
# while 루프를 생성한다. (안에다가 while을 끝내는 조건을 넣어주어야만 한다.)
while True:
# 테스트 구간거리/구간속도를 꺼낸다.
test_dist, test_speed = test[level]
# 현재 테스트 구간속도와 제한속도의 차와 max_tmp 중 최대값으로 max_tmp를 갱신한다.
max_tmp = max(test_speed-real_speed, max_tmp)
# 테스트 구간 거리가 해당 구간거리보다 길 경우
if (test_dist > real_dist):
# 테스트 구간거리에 해당 구간거리를 빼준다.
test[level][0] = test[level][0]-real_dist
# 그리고 해당 구간거리가 이미 지났으므로 while을 끝냄. (그럼 다음 구간거리로 넘어감)
break
# 테스트 구간 거리가 해당 구간보다 짧을 경우
elif (test_dist < real_dist):
# 해당 구간의 거리에 측정거리를 빼준 후
real_dist = real_dist - test_dist
# 다음 테스트 구간으로 넘겨준다. (이 경우 해당 구간은 아직 끝나지 않음.)
level += 1
# 테스트 구간 거리와 해당 구간이 동일할 경우
elif (test_dist == real_dist):
# 테스트 구간 거리에 해당 거리를 빼주고, (0이 됨)
test[level][0] = test[level][0]-real_dist
# 다음 테스트 구간으로 넘어간다.
level += 1
# 해당 구간거리가 이미 지났으므로 while을 끝낸다.
break
# 가장 크게 제한 속도를 넘어간 값을 출력한다.
print(max_tmp)
결과
'알고리즘 > 소프티어' 카테고리의 다른 글
[파이썬] Softeer 연습문제 #23. [21년 재직자 대회 예선] 전광판 완벽해설 (1) | 2024.01.11 |
---|---|
[파이썬] Softeer 연습문제 #22. [21년 재직자 대회 예선] 비밀 메뉴 완벽해설 (1) | 2024.01.10 |
[파이썬] Softeer 연습문제 #20. GINI야 도와줘 완벽해설 (1) | 2024.01.08 |
[파이썬] Softeer 연습문제 #19. 지우는 소수를 좋아해 완벽해설 (1) | 2024.01.05 |
[파이썬] Softeer 연습문제 #18. 택배 마스터 광우 완벽해설 (1) | 2024.01.04 |