[Baekjoon] 2841 외계인의 기타 연주 python

sorzzzzy·2021년 8월 22일
0

Baekjoon Algorithm

목록 보기
44/46
post-thumbnail

🏷 문제


💡 코드

from sys import stdin

N, P = map(int, stdin.readline().split())
melody = [list(map(int, stdin.readline().split())) for _ in range(N)]

# 기타의 1~6번줄 각각에 대한 리스트 생성
strings = [[] for _ in range(7)]

res = 0

# 입력받은 음계(줄, 프렛)
for l, f in melody:
    # 해당 줄에 프렛이 하나도 없으면 새로 추가
    if len(strings[l]) == 0:
        strings[l].append(f)
        res += 1

    # 해당 줄에 프렛이 있는 경우
    else:
        # 연주하려는 프렛이 기존의 프렛보다 높은 음이라면, 새로 추가
        if f > strings[l][-1]:
            strings[l].append(f)
            res += 1
            print(strings[l])
        # 연주하려는 프렛이 기존의 프렛과 같은 음이라면, 그냥 지나감
        elif f == strings[l][-1]:
            print(strings[l])
            continue
        # 연주하려는 프렛이 기존의 프렛보다 낮은 음이라면, 연주하려는 프렛보다 높은 음들을 모두 pop
        else:
            while strings[l] and f < strings[l][-1]:
                strings[l].pop()
                res += 1
            if strings[l] and f == strings[l][-1]:
                continue
            # 그리고 나서 연주하려는 프렛 추가    
            strings[l].append(f)
            res += 1
print(res)

🔑

✔️ 접근 방식

  • 기타 줄 개수만큼 리스트를 만듦
  • 입력받은 멜로디를 보면서 해당 줄에 프렛이 없다면 추가해주고,그렇지 않은 경우는 다시 3가지 경우로 나누어 조건을 확인함
    • 연주하려는 프렛이 기존 프렛보다 높다면? ➡️ 새로 추가 후 결과값 카운트
    • 연주하려는 프렛이 기존 프렛과 같다면? ➡️ 그냥 넘어감
    • 연주하려는 프렛이 기존 프렛보다 낮다면?
      ➡️ 연주하려는 프렛보다 높은 음들을 모두 pop() 한 후 새로 추가결과값 카운트

💡 마지막 경우의 조건문에서 while strings[l]: 를 고려하지 않아서 계속 인덱스 오류가 났다 😂
해당 기타 줄에 프렛이 남아있는 지 부터 확인했어야 했는데 간과하고 있었다 하하,,,,

profile
Backend Developer

0개의 댓글