[백준] 5430번: AC

가영·2021년 2월 24일
0

알고리즘

목록 보기
28/41
post-thumbnail

문제보기

처음에는 R명령 시 진짜로 리스트를 뒤집어서 계속 시간초과가 났다. 그래서 실제로 뒤집지는 않고 rFlag 변수를 선언해서 rFlag값을 !rFlag로 바꿔주었다. 마지막에 출력할 때 rFlag가 True일 경우 뒤집어서 출력해주기만 하면 된다.

시간초과를 해결하니 채점은 되는데, 계속 50%에서 틀리는 것이다. 그래서 구글링을 했는데 이 문제의 FAQ가 있었다~ 나같이 틀린 사람이 많은 것 같았다. 확인해보니 내가 실수한 이유가 딱 나와있었다.

  1. 진짜로 배열의 모든 원소를 뒤집으면 안된다.
  2. 배열의 맨 앞 원소를 무작정 지워서는 안된다. (나는 덱 사용)
  3. 빈 배열은 []로 출력해야한다.
  4. 배열이 비어있을 때 R을 하는 건 에러가 아니다. D만 에러다.
  5. 테스트 케이스마다 초기화가 잘 됐는지 확인해라. 개행문자를 항상 출력하는지도.
    ...

틀렸던 코드를 보자

def solve(ops, s):
    sList = s.split(',')
    if not sList[0]:
        ans.append('error')
        return
    ...

나는 solve()의 매개변수인 s에, 입력 문자열의 '['와 ']'를 제거해서 넣어주었는데, '[]'가 입력으로 들어온 경우, s가 빈문자열이 되므로 sList는 ['']가 된다.

이 상태에서 D연산을 하면 당연히 에러지만, R연산만 일어날 수도 있기 때문에 무작정 에러로 처리하면 안되는 것이었다😱

그래서 저 부분을 다음과 같이 고쳐주었다. 비어있는 배열이 입력으로 들어온 경우, 실제로 sList를 비워줘야 원하는 연산이 일어나므로

def solve(ops, s):
    sList = s.split(',')
    if not sList[0]:
        sList = []
    arr = deque(sList)
    ...

빈문자열을 원소로 가지고 있었던 sList를 비워줬다. 그리고 그 후에 연산을 수행.

정답 코드 🙏🏻

from _collections import deque

T = int(input())
ans = []


def solve(ops, s):
    sList = s.split(',')
    if not sList[0]:
        sList = []
    arr = deque(sList)
    rFlag = False
    for op in ops:
        if op == 'R':
            rFlag = not rFlag
        else:  # 'D'일 때
            if len(arr) == 0:
                ans.append('error')
                return
            if rFlag:  # 거꾸로일 때
                arr.pop()
            else:
                arr.popleft()
    if len(arr) == 0:
        ans.append('[]')
        return
    if rFlag:
        ans.append('['+','.join(list(reversed(arr)))+']')
    else:
        ans.append('['+','.join(arr)+']')


for _ in range(T):
    ops = input()
    input()
    s = input()[1:-1]
    solve(ops, s)
for r in ans:
    print(r)

0개의 댓글