본문 바로가기
알고리즘/스택 \ 큐 \ 덱

#11 [파이썬] 백준 2841번 문제: 외계인의 기타 연주

by 채채씨 2021. 4. 13.
728x90
반응형

<문제>

 

www.acmicpc.net/problem/2841

2841번: 외계인의 기타 연주

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

www.acmicpc.net


 

<소스코드>

import sys

N, P = map(int, input().split())
cnt = 0
lst = [[] for _ in range(7)]

for i in range(N):
    n, p = map(int, sys.stdin.readline().split())
    if not lst[n-1]:
        lst[n-1].append(p)
        cnt += 1
    else:
        while lst[n-1] and p < lst[n-1][-1]:
            lst[n-1].pop()
            cnt += 1
        if not lst[n-1] or p > lst[n-1][-1]:
            lst[n-1].append(p)
            cnt += 1
        else:
            pass
print(cnt)

 

<NOTE>

1. 리스트 내가 비어있는지 아닌지 체크

리스트 stack이 비어있다면

if not stack:

리스트 stack이 비어있지 않다면

if stack:

 

(참고) 리스트 내 특정 아이템이 있는지 체크

특정 아이템 a가 리스트 stack에 있다면

if a in stack:

특정 아이템 a가 리스트 stack에 없다면

if a not in stack:

 

3. 데이터를 쌍으로 저장하여 컨트롤하고 싶을 때

기타줄 번호와 같이 상위 변수에 대해 빈 리스트 안에 그 개수만큼 빈 리스트를 만들고 시작한다. 즉 이중 리스트를 만드는 것이며, 리스트의 인덱스 자체가 상위 변수를 가리키는 것이다.

lst = [[] for _ in range(7)]

 

4. pass와 continue의 차이

pass는 단순히 실행할 코드가 없다는 의미이고, continue는 현재 시점에서 멈추고 다음 loop를 실행하라는 의미를 가진다. 이어서 다음 명령을 수행하는 pass와 달리 continue를 사용할 경우, 현재 loop에서 수행할 명령어가 더 있음에도 불구하고 강제종료 후 다음 loop로 넘어간다는 것이 차이점이다.

728x90
반응형

댓글