Algorithm Problems

[백준] [Python] 5430번 AC - 스택

WakaraNai 2021. 5. 29. 13:43
728x90
반응형

https://www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

 

 

 

Python

import sys

for _ in range(int(sys.stdin.readline().rstrip())):

    cmd = sys.stdin.readline().rstrip()
    n = int(sys.stdin.readline().rstrip())
    arr = sys.stdin.readline().rstrip()[1:-1].split(',')

    if arr[0] != '':
        arr = list(map(int, arr))
    elif "D" in cmd:
        print("error")
        continue

    front = 0
    end = len(arr)-1
    isReverse = 1  # not reverse
    isError = False
    for c in cmd:
        if c == "R":
            end, front = front, end  # front = len(arr)-front-1
            isReverse *= -1
        else:
            if (end < front and isReverse == 1) or (end > front and isReverse == -1):
                isError = True
                #print(front, end)
                break
            front += isReverse  # front-1 if isReverse==-1 else front+1
        # print(c, isReverse, front, end)


    if isError:
        print("error")
    else:
        print("[", end="")
        for i in range(front, end+isReverse, isReverse):
            if i == end:
                print(arr[i], end="")
            else:
                print(arr[i], end=",")
        print("]")

 

 


짧은 풀이

  • reverse 사실 표현하기
    • 해당 변수에 -1를 매번 곱해준다. 1이면 -1이 되고, -1이면 1이 되므로 이전 값 확인할 필요 없이 반전된다.
  • reverse에서 front와 end 교차하기
    • 교차된다는 점에 주의하여, 삭제할 때 배열이 비어있는지 확인하기 위해 end와 front가 서로를 지나쳤는지 확인
  • reverse된 배열 출력하기
    • reverse가 -1이므로 이 값을 range()의 step으로 넣으면 감소하는 형식이 출력됨
    • front = 5, end = 3이라면 5, 4, 3이 차례대로 출력되는 방식
      • 이 때 end 값이 제대로 출력될 수 있도록 end-1을 해주어야 한다
      • 이미 reverse 표현 변수에 -1이 들어 있으므로 end+reverse를 하면 end-1 식이 된다
728x90
반응형