스파르탄 365 5주차 (1) AC

참고사이트: 발현되지 못한 잠재력

5주차

백준 5430번 AC

문제링크 : https://www.acmicpc.net/problem/5430

💡 풀이 중 고민

  • [1,2,3,4]를 입력받아서 리스트로 어떻게 변환하지?
    ! 문자열 슬라이싱을 이용하는 방법이 있다.
arr = sys.stdin.readline()[1:-2].split(",")
  • 런타임 에러 났다.
    -> 검색을 해 보니 'R' 명령어 때 진짜로 문자열을 다 뒤집어주면 시간초과 및 런타임 에러가 발생하는 것 같다

! 해결 방법

: R의 개수를 파악해서 홀수, 짝수일 때를 파악해 앞에서 자를지 뒤에서 자를지 결정

!! 스킬

arr = input()[1:-2].split(',')
cmd_p = cmd_p.replace('RR','') #R이 두번이면 원상 복구 되므로 명령어에서 제거
print('[' + ','.join(arr[::-1]) + ']')
print('[' + ','.join(arr) + ']')

깨달음

: 그러면 O(n)으로 끝낼 수 있다.

풀이

import sys
input = sys.stdin.readline

T = int(input())
for _ in range(T):
    cmd_p = input()
    n = int(input())
    arr = input()[1:-2].split(',')
    cmd_p = cmd_p.replace('RR','') #R이 두번이면 원상 복구 되므로 명령어에서 제거

    cntR = 0
    delF, delB = 0, 0 # R의 개수에 따라 앞에서 제거할지 뒤에서 제거할지 세는 변수

    for cmd in cmd_p:
        if cmd == 'R':
            cntR += 1
        elif cmd == 'D':
            if cntR%2 == 0:
                delF += 1
            else:
                delB += 1

    if delF+delB <= n:
        arr = arr[delF:n-delB]

        if cntR%2 == 1:
            print('[' + ','.join(arr[::-1]) + ']')
        else:
            print('[' + ','.join(arr) + ']')
    else:
        print('error')

좋은 웹페이지 즐겨찾기