[Python] 5430 AC

do0134·2022년 5월 6일
0

Algo_Problem

목록 보기
9/22

문제 요약

  • R로 배열을 뒤집고, D로 배열 맨 앞 요소를 삭제하는 함수 구현
  • 함수들과 배열이 주어졌을 때 결과 출력

아이디어 요약

  • R함수의 개수를 센다. D함수가 나올 때 짝수라면 popleft()를, 홀수라면 pop()를 한다.

  • (다른 코드 참고 사항) 위의 방법으로도 시간초과가 나지 않고 풀 수 있지만, D가 pop,popleft를 몇 번 해야하는 지 변수에 기록한다.

  • 그리고 그 기록만큼 슬라이싱하여 출력한다. R함수가 홀수라면 뒤집어서 출력하고 그렇지 않으면 그대로 출력한다.

import sys
from collections import deque
def solve():
    if func.count('D') > n:
        return 'error'
    else:
        temp = 0
        l = 0
        r = 0
        for i in func:
            if i == 'R':
                temp += 1
            elif i == 'D':
                if temp % 2:
                    r += 1
                else:
                    l += 1
        answer = arr[l:n-r]
        if temp % 2 :
            answer.reverse()
            return "[" + ",".join(answer) + "]"
        else:
            return "[" + ",".join(answer) + "]"


T = int(input())

for _ in range(T):
    func = sys.stdin.readline()
    n = int(input())
    arr = list(sys.stdin.readline().rstrip()[1:-1].split(","))
    print(solve())

후기

  • 사실 첫 번째 아이디어랑 다른 분들 아이디어를 참고했을 때 시간이나 메모리 차이가 크지 않았다. 오히려 메모리는 슬라이싱 때문에 더 많이 먹었다.

  • 오히려 pypy에서 비효율적일 수 있다. deque까지 쓴다면 아무래도 많은 메모리를 사용할 것이다.

  • 시간이 이례적으로 짧은 코드들이 있는데 애시당초 함수 입력을 받아올 때 len값으로 받아와서 활용하더라. len으로 잡으면 R이 연속적으로 나오는 수, D가 연속적으로 나오는 수가 배열에 입력되니까, split('R')을 사용하면 D부터 연속적인 길이를 알 수 있는 배열이 나온다.

  • 사실 위에 아이디어는 입력의 방식을 잘 알아야 된다. 아직은 거기에 대한 이해가 부족하다. 입력수를 보고 sys로 받았는데 input()을 저렇게까지 활용할 수 있구나 싶었다.

profile
응애 나 아기 코린이

0개의 댓글