ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5430. [Python]AC
    Python_알고리즘/Gold V 2023. 8. 8. 12:38

    1. 문제

     

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

     

    5430번: AC

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

    www.acmicpc.net

     

    2. 접근 방법

     

    • 시간 제한: 1초
    • 메모리 제한: 256MB
    • 파싱

     

    3. 파이썬 코드

     

    import sys
    from collections import deque
    # 많은 인풋 처리
    input = sys.stdin.readline
    
    T = int(input())
    
    for _ in range(T):
        # 명령어로 R or D 가 입력됨
        command = input()
        # N 의 갯수만큼 리스트 인풋
        N = int(input())
        # deque 형태로 리스트 ,을 기준으로 잘라버림
        num_list = deque(map(str,input().strip().split(",")))
        # 리스트에서 불필요한 "[","]" 을따로 처리해줌
        num_list[0] = num_list[0].strip("[")
        num_list[-1] = num_list[-1].strip("]")
        # flag 를 통해서 반복문 종료 시점 알려줌
        flag = 0
        # Reverse 가 되야하는지 아닌지 판단할 변수
        reverse_flag = 0
        # command 에 들어있는 변수를 탐색하며
        for i in command:
            # 만약 R인경우 reverse_flag 값이 0 이면 1로 1이면 0으로 변경
            if i == "R":
                if reverse_flag == 0:
                    reverse_flag = 1
                elif reverse_flag == 1:
                    reverse_flag = 0
            # D인 경우
            elif i == "D":
                # num_list 가 존재하고 num_list 첫번째 값이 "" 이 아닌 경우
                if num_list and num_list[0] != "":
                    # reverse_flag 값이 0 이면 왼쪽 값 추출
                    if reverse_flag == 0:
                        num_list.popleft()
                    # reverse_flag 값이 1 이면 오른쪽 값 추출
                    elif reverse_flag == 1:
                        num_list.pop()
                # 만약 위의 조건식 외의 경우
                else:
                    # flag 를 통해서 error 가 생긴 것을 알려주고 break
                    flag = 1
                    print("error")
                    break
        # flag 값이 1이 닌 경우
        if flag == 0:
            # deque로 구성된 값을 리스트로 치환
            num_list = list(num_list)
            # 만약 reverse 가 존재하면 
            if reverse_flag == 1:
                # list 값을 역순 정렬
                num_list = num_list[::-1]
                # join을 사용하여 출력형태 변경
                answer = ",".join(num_list)
                print(f"[{answer}]")
            # reverse 가 없으면
            elif reverse_flag == 0:
                # join을 통해서 출력 형태 변경
                answer = ",".join(num_list)
                print(f"[{answer}]")

     

    4. 문제를 풀고난 후 생각

     

    • 입력의 형태가 기존에 " " 공백을 두고 주어지는 것이 아닌 str 형태의 리스트 입력으로 주어진다.
    • 먼저 들어온 데이터를 파싱하여 기존의 우리가 다루는 list 형태로 변형해준 후 입력된 command 값을 통해서 어떻게 진행할지 생각을 해야한다.
    • pop(0) 보다는 덱을 통해 popleft()를 사용해서 시간 복잡도를 최소화 해야한다.
    • 조건에 맞게 R인 경우 reverse_flag 를 통해서 뒤집을지 말지를 결정하고 D의 경우 deque에 값이 있는지 없는지를 판단하여 error를 출력해야 하는지 값을 뽑아야 하는지 또한 결정 해야했다.
    • 모든 반복문이 끝난 후 출력단에서 파싱을 한번 더 진행해 줘야한다.
    • list 값을 join 을 통해서 ","를 붙여서 합쳐준 후 f-string 을 통해서 "[", "]" 값을 붙여서 맞게 출력해 줘야한다.
    • 알고리즘 적인 구현 보다는 문자열 파싱을 얼마나 잘 할 수 있는지를 물어보는 문제였던 것 같다.

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • 문자열 파싱

    'Python_알고리즘 > Gold V' 카테고리의 다른 글

    7576. [Python]토마토  (0) 2023.09.17
    1334. [Python]다음 팰린드롬  (0) 2023.09.17
    1038. [Python]감소하는 수  (0) 2023.09.08
    1083. [Python]소트  (0) 2023.09.07
    2493. [Python]탑  (0) 2023.02.06

    댓글

Designed by Tistory.