[Python] BOJ 2841 - 외계인의 기타 연주(GITARA)

728x90
반응형

https://www.acmicpc.net/problem/2841

 

2841번: 외계인의 기타 연주

첫째 줄에 멜로디에 포함되어 있는 음의 수 N과 한 줄에 있는 프렛의 수 P가 주어진다. (N ≤ 500,000, 2 ≤ P ≤ 300,000) 다음 N개 줄에는 멜로디의 한 음을 나타내는 두 정수가 주어진다. 첫 번째 정수

www.acmicpc.net

# 스택문제이다.

 

1. 우선 줄이 6개이므로 st에 빈 배열 6개를 선언해준다.

 

2. N만큼 반복문을 돌며 줄 번호와 프렛번호를 입력받는다.

 

3. 만약 st[line-1]에 원소가 존재한다면, 이미 그 줄을 누르고 있는 상태이다.

   따라서 p(프렛번호)와 그 줄에서 가장 높은 음인 st[line-1][-1]을 비교해서

   p가 더 작으면 그 줄에 있는 높은 음을 pop해주고, p와 같으면 그냥 넘어가고

   p가 더 크면 st[line-1]에 p를 append해준다.

   (이 모든 것을 할때마다 손가락이 움직이는 것이므로 answer 1증가)

 

4. 만약 p가 그 줄의 가장 낮은 음보다도 작으면 st[line-1]의 원소를 모두 pop하게 된다. 

  따라서, 그 경우에 19번째줄에서 st[line-1]이 비었으면 st[line-1]에 [p]를 넣어주어야 한다.

 

5. (22번째 줄) 당연히 입력받은 line에 손가락이 없으면 st[line-1]에 [p]를 넣어주면 된다.

 

import sys
input = sys.stdin.readline
N, P = map(int,input().split())
st = [[] for _ in range(6)]
answer = 0
for _ in range(N):
	line, p = map(int,input().split())
	if st[line-1]:
		while st[line-1]:
			if p < st[line-1][-1]:
				st[line-1].pop()
				answer += 1
			elif p == st[line-1][-1]:
				break
			else:
				st[line-1].append(p)
				answer += 1
				break
		if not st[line-1]:
			st[line-1] = [p]
			answer += 1
	else:
		st[line-1] = [p]
		answer += 1

print(answer)

(solved.ac 티어: 실버 2)

728x90
반응형
TAGS.

Comments