본문 바로가기
알고리즘/BOJ

[BOJ] 5430번 AC / 사용언어 : 파이썬(python)

by 바른 호랑이 2021. 12. 26.
728x90
반응형

※ 문제링크

 

5430번: AC

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

www.acmicpc.net

※ 관련개념 

 

[자료구조] 덱(Deque)

자료구조 덱

velog.io

해당 문제는 자료구조의 하나인 덱과 문자열 파싱을 활용하여 해결해야하는 문제였다. 덱을 간단하게 설명하면 앞과 뒤에 요소를 삽입하고 제거할 수 있는 형태의 자료구조이다. 단순하게 R명령(순서를 반대로 뒤집는 명령)을 수행할 함수를 만들어 popleft만으로 작성해도 코드는 정상적으로 작동하나 시간초과가 나왔다. 그래서 R명령의 상태를 기록할 변수를 만들고 마지막 출력 전까지는pop과 popleft를 번갈아 사용하고 R명령의 상태에 따라 출력전에 한번만 뒤집어 주는 형태로 코드를 작성했다. 풀이 방법과 코드는 아래와같다.

1. 입력값을 받고 저장할 변수들을 만들어준다.

  (R, D명령을 기록할 변수에 RR이 두번 붙어있는 경우는 RR을 공백으로 변경[RRD -> D])

  (리스트의 요소들이 문자열 형태로 들어오기때문에 replace와 split을 활용하여 리스트형태로 변환)

2. R명령의 상태를 기록할 check변수를 선언하고, R명령의 상태에 따라 D명령을 pop또는 popleft로 수행하여 준다.

3. 최종적으로 출력문을 출력할 출력코드를 작성해준다.(시간 단축을 위해 sys를 사용, 개행문자 삽입 및 삭제필수)

+ 추가적으로 결과출력문 예시를 보면 리스트를 출력할때 공백문자가 없는 것을 확인할 수 있다. 단순히 리스트를

   f스트링을 통해 출력하면 결과값이 달라져서 틀린 답이 되므로 반드시 수정하여 제출해야한다.

   (그냥 출력시, [1, 2, 3]으로 출력되어 [1,2,3]과 다른 결과값을 출력되어 틀리게 처리되니 유의하자)

 

def R(sample_list):
    c_list = []
    for i in range(len(sample_list)-1, -1, -1):
        c_list.append(sample_list[i])
    return c_list

from collections import deque
import sys
T = int(sys.stdin.readline())
for i in range(T):
    if i == T-1:
        order = sys.stdin.readline().rstrip().replace('RR', '')
        N = int(sys.stdin.readline())
        n_list_raw = sys.stdin.readline().rstrip()
        if n_list_raw == '[]':
            n_list = deque([])
        else:
            n_list = list(map(int, n_list_raw.replace('[', '').replace(']', '').replace(',', ' ').split()))
            n_list = deque(n_list)
        check = 0
        for od in order:
            if od == 'R' and check == 0:
                check += 1
            elif od == 'R' and check == 1:
                check -= 1
            if od == 'D' and check == 1:
                if len(n_list) == 0:
                    n_list = 'error'
                    break
                else:
                    n_list.pop()
            if od == 'D' and check == 0:
                if len(n_list) == 0:
                    n_list = 'error'
                    break
                else:
                    n_list.popleft()                
        if n_list != 'error':
            if check == 0:
                n_list = str(list(n_list)).replace(' ', '')
                sys.stdout.write(f'{n_list}')
            else:
                n_list = str(R(n_list)).replace(' ', '')
                sys.stdout.write(f'{n_list}')
        else:
            sys.stdout.write(f'{n_list}')
    else:
        order = sys.stdin.readline().rstrip().replace('RR', '')
        N = int(sys.stdin.readline())
        n_list_raw = sys.stdin.readline().rstrip()
        if n_list_raw == '[]':
            n_list = deque([])
        else:
            n_list = list(map(int, n_list_raw.replace('[', '').replace(']', '').replace(',', ' ').split()))
            n_list = deque(n_list)
        check = 0
        for od in order:
            if od == 'R' and check == 0:
                check += 1
            elif od == 'R' and check == 1:
                check -= 1
            if od == 'D' and check == 1:
                if len(n_list) == 0:
                    n_list = 'error'
                    break
                else:
                    n_list.pop()
            if od == 'D' and check == 0:
                if len(n_list) == 0:
                    n_list = 'error'
                    break
                else:
                    n_list.popleft()                
        if n_list != 'error':
            if check == 0:
                n_list = str(list(n_list)).replace(' ', '')
                sys.stdout.write(f'{n_list}\n')
            else:
                n_list = str(R(n_list)).replace(' ', '')
                sys.stdout.write(f'{n_list}\n')
        else:
            sys.stdout.write(f'{n_list}\n')

 

P.S 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글