본문 바로가기
코딩테스트

[Python] 백준 12789번 - 도키도키 간식드리미

by 박매트 2024. 5. 30.

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() 사용하기

문제 제대로 읽기