문제가 궁금하시다면 아래의 링크를 눌러주세요!
문제 보러 가기
추월(追越) : 뒤에서 따라잡아서 앞의 것보다 먼저 나아감.
출처: 네이버 사전 https://ko.dict.naver.com/#/entry/koko/67abd764c52140038d9df17c76b60058
import sys
input = sys.stdin.readline
N = int(input())
order = dict()
cnt = 0
in_order = [input() for _ in range(N)]
for idx, car in enumerate(in_order):
order[car] = idx
out_order = [input() for _ in range(N + 1, (N * 2) + 1)]
out_car = []
for idx, car in enumerate(out_order):
if idx < order[car]:
out_car.append(car)
cnt += 1
else:
before_in_order = in_order[:order[car]]
after_out_order = out_order[idx:]
for remain_car in after_out_order:
if remain_car != car and remain_car in before_in_order:
out_car.append(car)
cnt += 1
break
print(cnt)
통과!..했지만 너무 시간이 오래 걸렸다. 분명 이보다는 더 빠른 풀이 방법이 있을 것이라고 생각했고, 개선 방안을 고민하게 되었다.
추월 차량을 파악하는 과정 중 퇴장 순서가 입장 순서보다 빠르지 않은 경우의 코드에서 오랜 시간이 걸렸다. 여기에서 다시 반복문이 들어오면서, 결과적으로 O(N^2) 혹은 그 이상의 복잡도가 소요되어 시간이 오래 걸린 것 같다.
추월에 대한 모든 경우를 고려하면서, O(N) 정도의 시간복잡도로 문제를 해결할 수 있는 방법에 대해 고민했지만, 마땅한 방법이 떠오르지 않아 결국 다른 풀이를 참고하였다.
참고한 풀이 링크
다른 풀이들도 많았지만, 이 풀이가 가장 간결하면서 읽기 쉬웠던 것 같다.
N까지의 정수 인덱스 i에 대해서, 입장 - 퇴장 리스트의 i번째 값(차량)이 일치하지 않는 경우, 퇴장 리스트에서의 i번째 차량을 찾아 입장 리스트에서 해당 차량을 삭제했다가, 입장 리스트의 i번째 위치에 해당 차량을 다시 삽입한다.
처음 문제를 풀이할 때 생각했던 추월 차량의 조건 2가지를 위의 로직을 통해 간단하게 구현할 수 있었다..!
import sys
input = sys.stdin.readline
N = int(input())
cnt = 0
in_car = [input() for _ in range(N)]
out_car = [input() for _ in range(N)]
for i in range(N):
if in_car[i] != out_car[i]:
in_car.remove(out_car[i])
in_car.insert(i, out_car[i])
cnt += 1
print(cnt)
통과!
읽어주셔서 감사합니다!