백준 #5430

이은지·2022년 4월 8일
0

코딩 테스트

목록 보기
8/10
post-thumbnail

문제

백준 5430번: AC

내 코드

from collections import deque as dq
import sys

t = int(sys.stdin.readline())

def conduct_AC(func, deque):
  reversed = 1 
  for i in range(len(func)):
    f = func[i]
    if f == 'R':
      reversed = -reversed
    elif f == 'D':
      if len(deque)==0:
        print('error')
        return
      if reversed == 1:
        deque.popleft()
      else:
        deque.pop()
  
  if reversed == -1:
    deque.reverse()

  ans = ''
  for i in range(len(deque)):
    ans = ans + str(deque[i])
    if i < len(deque)-1:
      ans += ','
  print(f'[{ans}]')

for i in range(t):
  deque = dq()
  func = sys.stdin.readline()
  n = int(sys.stdin.readline())
  input = sys.stdin.readline().strip('[]\n')
  
  if n>0:
    list = [int(item) for item in input.split(',')]
    deque.extend(list)
    
  conduct_AC(func, deque)
  

입력이 특이했던 문제. 세 줄을 한 세트로 받아와야 했다.conduct_AC라는 함수를 만들어서 그 함수를 for문으로 테스트 케이스 개수만큼 실행했다. 그리고 입력에 대괄호가 포함되어 있어서 그것도 없애줘야했다^__^. 출력도 그냥 리스트를 출력하면 틀려서 일일이 문자열을 이어붙여야 했다...[1, 2, 3] 아니고 [1,2,3]으로 출력해야됨

  • strip()의 인자로 문자열의 양끝에서 삭제하고 싶은 문자열을 넣어주면 손쉽게 제거할 수 있다.
    참고로 sys.stdin.readline()으로 파일을 읽어온 다음 인자 없이 strip()을 해주면 \n이 알아서 제거되는데, 이렇게 인자를 넣는 경우 \n을 명시해주지 않으면 제거가 안된다.
  • deque.extend(array)를 하면 배열을 단번에 deque에 넣을 수 있다. 정확히는 배열을 순회하면서 deque의 오른쪽에 추가하는 메소드이다. => deque(array) 해도 된다고함!
  • 답변 출력하는 부분에서 join 함수를 써주면 더 간편하게 출력할 수 있다고 한다.
    join("[" + ",".join(deque) + "]")

문제풀이 아이디어

배열의 순서를 뒤집는 연산은 시간복잡도가 O(N)이다. 최대한 피해야 한다.
배열을 실제로 뒤집을 필요가 없다. 원래 D일 때 왼쪽에서 삭제했다면, 뒤집고 난 후에는 오른쪽에서 삭제하면 된다.

12345의 오른쪽에서 5를 삭제하는 것과 54321의 왼쪽(기본)에서 5을 삭제하는 건 결국 똑같다.

deque의 pop()과 popleft()를 사용했다.

reversed 라는 변수를 선언해 1을 할당했다. 명령어 R이 나오면 이 값을 -reversed로 바꿨다. 어차피 이 값은 pop()을 하냐 popleft()를 하냐 이걸 결정하는데만 쓰이기 때문에 몇 번 뒤집혔는지를 기록할 필요가 전혀 없다. 어차피 0번 뒤집기 == 2번 뒤집기 == 4번 뒤집기 == ... 다. 뒤집는 과정에서 원소가 삭제되어도 어차피 맨 끝에서 삭제하기 때문에 순서에는 영향이 없다.

다만 답을 출력할 때는 실제로 배열을 뒤집어서 출력해야 하므로, 출력 전에 reversed 값을 확인해 -1이면 deque.reverse()를 해준다.

참고로 deque = deque.reverse() 이렇게 재할당을 할 필요 없이 deque.reverse()만 하면 된다. 재할당을 하면 내가 원하는 작업이 잘 수행 되지 않는다. (파이썬에서 이런 실수 많이 했었는데 이게 파이썬 특징인건지 모르겠다. 무튼 JS랑은 다르다.)

profile
교육학과 출신 서타터업 프론트 개발자 👩🏻‍🏫

0개의 댓글