https://www.acmicpc.net/problem/2841
2841번: 외계인의 기타 연주
첫째 줄에 멜로디에 포함되어 있는 음의 수 N과 한 줄에 있는 프렛의 수 P가 주어진다. (1 ≤ N ≤ 500,000, 2 ≤ P ≤ 300,000) 다음 N개 줄에는 멜로디의 한 음을 나타내는 두 정수가 주어진다. 첫 번째
www.acmicpc.net
2841번: 외계인의 기타 연주
레벨 실버 1
접근 방식
1. 총 6개의 줄이므로, 각각에 해당하는 스택을 미리 만든다.
2. line에 해당하는 스택이 존재하며, top에 있는 프렛이 현재 누를 프렛보다 높다면 해당 프렛 삭제 (손 떼어내기)
3. 이미 해당 프렛을 누르고 있다면, continue
4. 현 프렛을 stack에 추가 (누르기)
내 코드
n, P = map(int, input().split())
stk = [[] for _ in range(7)] # 총 6개의 줄
answer=0
for i in range(n) :
line, p = map(int ,input().split())
if len(stk[line]) == 0 : #존재하지 않으면
stk[line].append(p)
answer+=1
else: #존재하면
if stk[line][-1] < p : # 현재 음이 더 높으면
stk[line].append(p) # 누르기
answer+=1
elif stk[line][-1] > p : # 떼어낼 필요가 있는 경우
for _ in range(len(stk[line])) :
if stk[line][-1] < p : #반복하다가, 떼어낼 필요 없으면 break
break
if stk[line][-1] > p : # 손 떼어내기
answer+=1
stk[line].pop()
elif stk[line][-1] == p: # 현 프렛과 동일하면 break
break
if len(stk[line]) == 0: # 누르기
stk[line].append(p)
answer+=1
elif stk[line][-1] != p: # 누르기
stk[line].append(p)
answer+=1
elif stk[line][-1] == p :
continue
elif stk[line][-1] == p :
continue
print(answer)
주구장창 써놓긴 했지만 별 건 아니고 길게 썼다.. 그냥 문제를 풀다보니까 어 이 경우 안 되네 저 경우 안되네 하다가 코드가 길어짐 == 최적화가 되지 않았음..^^
물론 아래의 답과 성능상은 크게 다르지 않겠지만 직관성이 떨어진다.
최종
N, P = map(int, input().split())
stk = [[] for _ in range(7)] # 총 6개의 줄
ans = 0
for _ in range(N) :
line, p = map(int, input().split())
#해당 line이 존재하고, 현 프렛보다 높다면
while stk[line] and stk[line][-1] > p :
stk[line].pop()
ans+=1
# 이미 해당 프렛을 누르고 있다면 continue
if stk[line] and stk[line][-1] == p:
continue
stk[line].append(p)
ans+=1
print(ans)
내 코드를 다 작성하고, 맞은 걸 본 후에 답을 찾아봤다.
내 말도 안되게 쓸데없이 긴 코드를 깔끔하게 추려보자면 위와 같은 코드로 결론날 수 있을 것이다.
예제에 답을 끼워넣다보니 저렇게 길어지는 것 같다. 나중에는 코드를 최적화할 수 있는 방향에 대해서 고민해봐야 할 것 같다.
내가 작성한 코드는 백준에 돌려봤을 때 448ms, 아래의 코드는 396ms로 나타났다.
'알고리즘 > Python' 카테고리의 다른 글
[백준] 파이썬 python - 9095번 : 1, 2, 3 더하기 (0) | 2023.12.12 |
---|---|
[백준] 파이썬 python - 1270번 : 전쟁 - 땅 따먹기 (1) | 2023.12.07 |
[프로그래머스] python 파이썬 - 스킬트리 (1) | 2023.12.02 |
[프로그래머스] 파이썬 python - 방문 길이 (1) | 2023.11.24 |
[프로그래머스] 파이썬 python - 튜플 (0) | 2023.11.24 |