선릉역 1번 출구

baekjoon - 1874 본문

Algorithm/Algorithm 문제풀이

baekjoon - 1874

choideu 2021. 8. 28. 22:50
num = int(input())
stack = []
ls = []
k = 1
flag = 0

for _ in range(num):
    a = int(input())
    while k <= a:
        stack.append(k)
        ls.append('+')
        k+= 1
    if stack[-1] == a:
        stack.pop()
        ls.append('-')
    else:
        flag = 1
    
if flag == 0:
    for i in ls:
        print(i)
else:
    print("NO")
            

이 문제는 처음 입력받은 수열(n)을 만들기 위해 1~n까지의 수열을 push(+), pop(-)을 이용해서 만들 수 있냐?를 판정하는 문제이다.

만들 수 있으면 push와 pop을 사용한 결과를 출력하는 것이고, 아니면 NO을 출력해야 하기 때문에 flag 변수를 선언해 주었다.

입력받을 수열을 1~n까지의 수열을 오름차순으로 사용해서 만들 수 있는지 판정을 해야하는데 여기서 핵심은 먼저 오름차순으로 push하는 수이다. 4가 처음 입력받은 수라면 1~4까지 push를 하고 pop을 하는 건데, 입력받은 숫자가 push한 수보다 작으면 무조건 top에 위치해야한다. 위치하지 않으면 그 수보다 더 작은 수가 top에 위치한 것인데, 그럼 더이상 push가 가능하지 않기 때문에 NO을 출력하게 된다.

[1, 2, 5, 3, 4]가 그 예시인데, 5에서 pop을 하고 나면 stack에는 4, 3이 위치한다. 그런데 그 다음 수가 4가 아닌 3이어서 4를 pop하고 3을 pop해서 4가 소실된다. 다시 숫자를 push해줄 수 없기 때문에 이 경우 NO를 출력하게 되는 것이다.

만약 [1, 2, 5, 4, 3]이었다면 제대로 출력을 했을 것 이다.

'Algorithm > Algorithm 문제풀이' 카테고리의 다른 글

baekjoon - 10845  (0) 2021.08.30
baekjoon - 1406  (0) 2021.08.30
baekjoon - 9012  (0) 2021.08.28
baekjoon - 9093  (0) 2021.08.28
baekjoon - 10828  (0) 2021.08.28
Comments