알고리즘/백준
[백준 2841][파이썬] 외계인의 기타 연주
2twix2
2022. 2. 11. 01:20
https://www.acmicpc.net/problem/2841
2841번: 외계인의 기타 연주
첫째 줄에 멜로디에 포함되어 있는 음의 수 N과 한 줄에 있는 프렛의 수 P가 주어진다. (N ≤ 500,000, 2 ≤ P ≤ 300,000) 다음 N개 줄에는 멜로디의 한 음을 나타내는 두 정수가 주어진다. 첫 번째 정수
www.acmicpc.net
줄이 6개여서 각 줄에 대한 stack을 만들었다. 새로 눌러야 하는 프렛이 그 줄의 스택에서 최대가 될 때까지 스택을 pop 하고 손가락 움직임 횟수에 1을 더했다.
pop을 하던 중 스택의 최댓값과 눌러야 하는 프렛이 같은 경우 프렛을 누르는 행동을 다시 할 필요가 없으므로 이 상황에서 움직임 횟수에 1을 더하지 않도록 주의해야 한다.
import sys
input = sys.stdin.readline
N, P = map(int, input().split())
stack1 = []
stack2 = []
stack3 = []
stack4 = []
stack5 = []
stack6 = []
finger_move = 0
def comparison(stack, num):
temp = 0
while not(len(stack) == 0 or stack[-1] <= num):
temp += 1
stack.pop()
if len(stack) != 0:
if stack[-1] != num:
temp += 1
stack.append(num)
else:
temp += 1
stack.append(num)
return temp
for i in range(N):
a, b = map(int, input().split())
if a == 1:
finger_move += comparison(stack1, b)
elif a == 2:
finger_move += comparison(stack2, b)
elif a == 3:
finger_move += comparison(stack3, b)
elif a == 4:
finger_move += comparison(stack4, b)
elif a == 5:
finger_move += comparison(stack5, b)
else:
finger_move += comparison(stack6, b)
print(finger_move)