백준 5430번 바로가기

첫 번째 풀이

t = int(input()) # 테스트 케이스의 개수
for _ in range(t):
  # 입력
  p = input() # 수행할 함수 1~100,000
  n = int(input()) # 배열에 들어있는 수의 개수 1~100,000
  arr = input()[1:-1].split(',')

  if n == 0:
    arr = []

  # 처리
  for f in p:
    if f == "R":
      arr = arr[::-1]
    elif f == "D":
      if arr == []:
        print('error')
        break
      else:
        arr.pop(0)

  print('['+','.join(arr)+']')
    

두 번째 풀이

from collections import deque

t = int(input()) # 테스트 케이스의 개수
for _ in range(t):
  # 입력
  p = input() # 수행할 함수 1~100,000
  n = int(input()) # 배열에 들어있는 수의 개수 1~100,000
  arr = deque(input()[1:-1].split(','))

  if n == 0:
    arr = deque()

  # 처리
  for f in p:
    if f == "R":
      arr.reverse()
    elif f == "D":
      if arr:
        arr.popleft()
      else:
        print('error')
        break

  print('['+','.join(arr)+']')
    

세 번째 풀이

from collections import deque

t = int(input()) # 테스트 케이스의 개수
for _ in range(t):
  # 입력
  p = input() # 수행할 함수 1~100,000
  n = int(input()) # 배열에 들어있는 수의 개수 1~100,000
  arr = deque(input()[1:-1].split(','))

  if n == 0:
    arr = deque()

  count = 0
  # 처리
  for f in p:
    if f == "R":
      count += 1
    elif f == "D":
      if arr:
        if count%2 == 0:
          arr.popleft()
        else:
          arr.pop()
      else:
        print('error')
        break

  else:
    if count%2 == 1:
      arr.reverse()
    print('['+','.join(arr)+']')
    

CODE REVIEW

  1. 첫 번째 풀이에서는 시간초과 에러로 걸렸다. list로 구현하다보니 탐색에 시간이 오래 걸린 모양이다.
  2. 두 번째 풀이에서는 deque를 활용했는데, 여전히 시간초과 에러가 발생했다. reverse()가 여러번 실행되면서 그런듯…
  3. 세 번쨰 풀이에서는 reverse()가 여러 번 호출되는 것을 방지하기 위해 count=0을 도입해서 홀짝성에 따라 pop() popleft()을 선택하고, reverse()는 한 번만 실행해주었다.
  4. 처음에는 만만하게 봤던 문제였는데, 생각보다 고려할게 많았다. 이런 기법들은 기억해두었다가 시간 단축이 필요할 때 써먹어야겠다.