티스토리 뷰

728x90
반응형

문제

 

스택 (stack)은 기본적인 자료구조 중 하나로, 컴퓨터 프로그램을 작성할 때 자주 이용되는 개념이다. 

스택은 자료를 넣는 (push) 입구와 자료를 뽑는 (pop) 입구가 같아 

제일 나중에 들어간 자료가 제일 먼저 나오는 (LIFO, Last in First out) 특성을 가지고 있다.

1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 

이때, 스택에 push 하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 

임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 

있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 

이를 계산하는 프로그램을 작성하라.

 

입력

 

첫 줄에 n (1 ≤ n ≤ 100,000)이 주어진다. 

둘째 줄부터 n개의 줄에는 수열을 이루는 1 이상 n이하의 정수가 하나씩 순서대로 주어진다. 

물론 같은 정수가 두 번 나오는 일은 없다.

 

출력

 

입력된 수열을 만들기 위해 필요한 연산을 한 줄에 한 개씩 출력한다. 

push연산은 +로, pop 연산은 -로 표현하도록 한다. 

불가능한 경우 NO를 출력한다.

 

풀이

 

그냥 넘어갈까 하다가 그래도 스택 단원의 마지막 문제이니 적어두고 넘어가기로 했다.

 

내 경우엔 1874번은 문제만 읽어서는 도대체 무슨 소리를 하는 건지 이해할 수가 없었다.

 

그래서 일단 예제를 봄.

 

첫 줄에 n이 주어지면, 1부터 n까지의 숫자를 스택의 방법으로 넣었다가 뽑아내어 늘어놓는 것이 가능한지 파악해야 한다.

 

예제를 보면 첫 숫자인 4의 경우, 스택이 비어있으니 1, 2, 3, 4를 순서대로 넣고 4를 꺼내야 하기 때문에

 

연산 순서가 '+ + + + -'가 된다.

 

이어서 3의 경우엔 이미 스택에 들어가 있으니 바로 숫자를 꺼내고 '-'만 추가.

 

다음 경우인 6의 경우엔 현재 스택에 들어있는 숫자가 [1, 2]이기 때문에 이미 사용한 3, 4를 건너뛴 5, 6을 넣고

 

6을 꺼내야 한다. 그러니까 연산에 '+ + -'를 추가한다.

 

이런 식으로 끝까지 가면 된다. 그리고 만약 스택에 [1, 2]가 있는데 1을 꺼내려고 시도하면 방법이 없기 때문에

 

'NO'를 출력하고 프로그램을 종료시키면 된다.

 

나는 특정 숫자가 주어졌을 때 몇 개의 숫자를 추가로 넣어야 하는지를

 

주어진 숫자 - 스택에 남아있는 숫자의 개수 - 연산에서 '-'를 사용한 횟수

 

를 이용해 계산했고, 결과적으론 통과했다.

 

코드는 아래와 같다.

import sys

n = int(sys.stdin.readline().rstrip())

stack = []
result = []
cnt = 0

for _ in range(n):
    num = int(sys.stdin.readline().rstrip())
    
    if len(stack) == 0:
        m = num - cnt
        for i in range(m - 1, -1, -1):
            stack.append(num - i)
            result.append('+')
        result.append('-')
        cnt += 1
        stack.pop()
        
    else:
        if num < stack[-1]:
            print('NO')
            sys.exit()
        elif num == stack[-1]:
            result.append('-')
            cnt += 1
            stack.pop()
        elif num > stack[-1]:
            m = num - len(stack) - cnt
            for i in range(m - 1, -1, -1):
                stack.append(num - i)
                result.append('+')
            result.append('-')
            cnt += 1
            stack.pop()

print(*result, sep='\n')
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함