https://www.acmicpc.net/problem/12789
나의 답
from collections import deque
def check(stack,i): # 스택에 넣을 수 있는 지 확인
if len(stack)==0:
return True
elif i<stack[-1]:
return True
else:
return False
def stackpop(stack, i): #스택에서 빼낼 건지 확인..
if len(stack)==0:
return False
elif i == stack[-1]:
return True
else:
return False
n = int(input())
li = list(map(int, input().split()))
stack = []
target = 1 # 순서 입장 확인 번호
while len(li)>0:
i = li[0]
if i == target: # 그냥 줄, 간식 여부 확인
li.remove(i)
target+=1
elif stackpop(stack, target): # 스택 줄(간이), 간식 여부 확인
stack.remove(target)
target+=1
elif check(stack,i): # 간식 못받는 상황, 그냥 줄 지우고, 스택 넣을 수 있는 지 확인
li.remove(i)
stack.append(i)
else: # 간식도 못받고, 스택에 넣을 수도 없다? -> 못받는다.
break
if len(li)==0:
print("Nice")
else:
print("Sad")
값을 입력받은 후, 순서 입장 확인 번호를 확인할 수 있도록 target 변수를 선언했다.
입력받은 리스트 값이 다 사라질 때까지 확인을 했다.
간식을 바로 받을 수 있으면 리스트에서 값을 빼고,
받을 수 없는 순서라면 스택에 넣어둔다.
스택에 넣을 때, 기존에 있던 스택 마지막 값 보다 큰 값이 들어온다면 스택에 넣을 수가 없다.
넣을 수 없는 경우에 sad를 출력하면 된다.
한 번도 넣을 수 없는 경우를 만나지 않고, 스택에 있던 값도 다 빠져나가고, 입력받은 리스트 값도 다 빠져나갔다면,
간식을 받을 수 있는 것! Nice를 출력한다.
다른 사람 코드 - https://velog.io/@highcho/Algorithm-baekjoon-12789 참고 !
import sys
input = sys.stdin.readline
n = int(input())
wait = list(map(int, input().split()))
tmp = []
target = 1
for i in wait:
tmp.append(i)
while tmp and tmp[-1] == target: # tmp 스택 하나로 비교
tmp.pop()
target += 1
if len(tmp) > 1 and tmp[-1] > tmp[-2]:
print("Sad")
sys.exit()
if tmp:
print("Sad")
else:
print("Nice")
정말 간단하다...
짱.
알게 된 점
스택에서 값을 빼낼 때는 list이름.pop() 사용하기
파이썬 그냥 끝내버릴 때, sys.exit() 사용하기
문제 제대로 읽기
'코딩테스트' 카테고리의 다른 글
[Python] 백준 21921 블로그 (0) | 2024.05.31 |
---|---|
[Python] 백준 2960번 - 에라토스테네스의 체 (1) | 2024.05.30 |
[Python] 백준 17266번 - 어두운 굴다리 (0) | 2024.05.30 |
[Python] 2941번 - 크로아티아 알파벳 (0) | 2024.05.24 |
[Python] 가장 높은 탑 쌓기 (LIS 응용) (0) | 2024.05.24 |