알고리즘/백준

[백준 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)