[백준] 스택 수열_1874번

손시연·2022년 4월 30일
0

algorithm

목록 보기
13/18

스택 수열_1874번

코드

import sys
n = int(sys.stdin.readline())
nums = [i for i in range(1, n+1)]  # sorted array(1 ~ n)
seq = []  # input numbers
list = []

for _ in range(n):
    seq.append(int(sys.stdin.readline()))

answer = []
pointer = 0  # index pointer

while nums:
    if not list:  # empty
        answer.append('+')
        list.append(seq.pop(0))
    if nums[pointer] == list[0]:
        answer.append('-')
        nums.pop(pointer)
        list.pop(0)
        pointer -= 1
        pointer = max(0, pointer)
    elif nums[pointer] < list[0]:
        answer.append('+')
        list.append(seq.pop(0))
        pointer += 1
    else:
        answer = ["NO"]
        break

for a in answer:
    print(a)

풀이노트

문제 이해

  • 1 2 3 4 5 6 7 8 오름차순 배열을 push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop 하면 4 3 6 8 7 5 2 1 수열을 만들 수 있음
  • 1 2 5 3 4 수열은 1 2 3 4 5 로 만들 수 없으므로 "NO" 를 출력

문제 설명

  • nums = [i for i in range(1, n+1)] # sorted array(1 ~ n) : 첫번째 input을 통해 1부터 n까지 오름차순 배열을 생성함
  • if not list: # empty : seq 는 사용자로부터 받은 수열의 형태이고, nums 와 비교하기 위해서는 새로운 배열인 list 가 필요함. 시작할 때 숫자가 들어간 상태에서 시작하는 것이 아니라 + 하고 시작해야 함.
  • pointer : nums 의 index 위치를 표시함
  • seq.pop(0) 한 list 배열과 nums 배열을 pointer 로 비교하면서 answer 에 '+' 또는 '-' 를 삽입함
  • if elif else
    • if nums[pointer] == list[0]: : 일치하는 경우 숫자를 pop 함
    • elif nums[pointer] < list[0]: : 한 칸 움직임
    • else: : 수열 생성 불가

예외 처리

  • 예외 : 1 4 3 2 5 -> +-+++---+-
  • pointer = max(0, pointer) : pointer 는 nums 의 index 를 표시하는 변수이므로, -1 이하 값을 가질 수 없음

소요시간 : 6시간

profile
Server Engineer

0개의 댓글