[백준 5430] AC

코뉴·2021년 8월 9일
0

백준🍳

목록 보기
43/149

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

🥚문제


🥚입력/출력


🍳코드

import sys
from collections import deque
input = sys.stdin.readline

for _ in range(int(input())):
    cmd = input().strip()
    # cmd 내 D 함수의 총 개수
    d_count = cmd.count('D')

    # 배열에 들어 있는 수의 개수
    size = int(input())

    # 문자열을 리스트 형식으로 바꾸고 있음
    data = input().strip()[1:-1].split(',')

    # 리스트 안의 요소들을 int 형식으로 바꿔줌
    # 만약 리스트가 비었거나 [''] -> 숫자로 변환할 수 없으므로 이 케이스 제외
    if len(data) > 0 and data[0] != '':
        for i in range(len(data)):
            data[i] = int(data[i])

    # data 리스트를 deque화
    q = deque(data)

    # D 함수의 총 개수가 수의 개수를 초과하면 에러
    if d_count > size:
        print("error")
        continue

    # 만약 명령어가 RDDR...이라면
    # [[R, 1], [D, 2], [R, 1] ...] 형식으로 저장하는 cmd_list
    cmd_list = []
    prev_code = None # 직전의 코드를 저장
    for code in cmd:
        if len(cmd_list) == 0:
            cmd_list.append([code, 1])
            prev_code = code #cmd_list에 삽입한 code를 prev_code로 저장
        else:
            if code == prev_code:
                cmd_list[-1][1] += 1
            else:
                cmd_list.append([code, 1])
                prev_code = code


    # cmd_list를 순회하면서 고고
    # reverse를 나타내는 flag
    REVERSE = False
    for code in cmd_list:
        if code[0] == "R":
            # R이 홀수번 등장하면 reverse의 현재 상태의 역을 취함!
            if code[1] % 2 == 1:
                REVERSE = not REVERSE

        elif code[0] == "D":
            # REVERSE가 True이면 pop
            if REVERSE:
                # D의 개수만큼 반복
                for i in range(code[1]):
                    q.pop()
            # REVERSE가 False이면 popleft
            else:
                # D의 개수만큼 반복
                for i in range(code[1]):
                    q.popleft()

    # 출력
    # 만약 출력 단계에서 REVERSE = True인 상태라면
    # 뒤에서부터 출력해야한다
    if REVERSE:
        print_list = list(q)
        print_list.reverse()
        # 이 문제의 함정! 리스트를 프린트 할 때 콤마 뒤에 띄어쓰기 없어
        print('[' + ','.join(map(str, print_list)) + ']')
    else:
        print_list = list(q)
        print('[' + ','.join(map(str, print_list)) + ']')

🧂아이디어

  • 어떻게 하면 좀 더 간단하게 풀어낼 수 있을지를 중점적으로 생각했던 문제. "모든 명령어를 하나하나 실행하지 않아도 되지 않을까?"
  • 초반에 실패를 했었는데 반례를 찾아내서 풀 수 있었다.
  • 출력 형식이 달라서 틀렸다고 뜨기도 했다!😅 [1,2,3] 이 맞는 출력 형식이었는데 나는 [1, 2, 3]으로 풀고 있었다 ㅎㅎ
profile
코뉴의 도딩기록

0개의 댓글