파이썬 알고리즘 149번 | [백준 5340번] - AC - deque

Yunny.Log ·2022년 5월 12일
0

Algorithm

목록 보기
152/318
post-thumbnail

149. AC

1) 어떤 전략(알고리즘)으로 해결?

구현
자료 구조
문자열
파싱

2) 코딩 설명

<내 풀이>

  • 시간초과를 줄일 방법
    1) 매번 reverse 를 진행하는 것은 비효율적
  • R 이 나오면 REVERSE를 하는게 아니라, R을 축적해서
    => R이 홀수번이라면 한번 뒤집혔다고 생각하고 맨 처음아이를 뽑는 것을 뒤에서 뽑는 것 (뒤집히면 맨 뒤가 처음이 되니깐)
    => 짝수번이라면 처음 상태 그대로니깐 popleft

import sys
from collections import deque

t= int(sys.stdin.readline())
qu=deque()

for i in range(t):
    rev=0
    p= list(sys.stdin.readline().strip())
    lenp = len(p)
    n= int(sys.stdin.readline().strip())
    qu = deque((sys.stdin.readline().strip().strip("[").strip("]").split(",")))

    for i in range(lenp):
        chk=0
        if p[i]=="R":
            rev+=1
            #qu=deque(reversed(qu)) #qu=deque(sorted(qu, reverse=True))
        else : 
            if len(qu)==0 or n==0: 
                chk=1
                print("error") 
                break
            else : 
                if rev%2==0:
                    qu.popleft()
                else : 
                    qu.pop()
    if(chk==0) :
        if(rev%2==0):
            res = ','.join(s for s in qu)
            print("["+res+"]")
        else :
            res = ','.join((s) for s in reversed(qu) )
            
            print("["+res+"]")

            

<내 틀린 풀이, 문제점>


import sys
from collections import deque

t= int(sys.stdin.readline())
qu=deque()

for i in range(t):
    p= list(sys.stdin.readline().strip())
    lenp = len(p)
    n= int(sys.stdin.readline().strip())

    if n==0 and "D" in p: #길이 0개면 에러
        tmp=sys.stdin.readline()
        print("error")
        break
    elif n==0 :
        tmp=sys.stdin.readline()
        print("error")
        break

    qu = deque(map(int,sys.stdin.readline().strip().strip("[").strip("]").split(",")))
    
    for i in range(lenp):
        if p[i]=="R":
            qu=deque(reversed(qu)) #qu=deque(sorted(qu, reverse=True))
        else : 
            if len(qu)==0: 
                print("error") 
                break
            else : 
                qu.popleft()

    res = ','.join(str(s) for s in list(qu))
    print("["+(res)+"]")
            

틀린 경우

1) RDDD - 2 - [1,2] 로 입력을 한 경우 에러가 출력되고 []도 추가적으로 출력, chk 라는 변수를 통해 이 상황 없앰

import sys
from collections import deque

t= int(sys.stdin.readline())
qu=deque()

for i in range(t):
    p= list(sys.stdin.readline().strip())
    lenp = len(p)
    n= int(sys.stdin.readline().strip())

    if n==0 and "D" in p: #길이 0개면 에러
        tmp=sys.stdin.readline()
        print("error")
        break
    elif n==0 :
        tmp=sys.stdin.readline()
        print([])
        break

    qu = deque((sys.stdin.readline().strip().strip("[").strip("]").split(",")))
    
    for i in range(lenp):
        chk=0
        if p[i]=="R":
            qu=deque(reversed(qu)) #qu=deque(sorted(qu, reverse=True))
        else : 
            if len(qu)==0: 
                chk=1
                print("error") 
                break
            else : 
                qu.popleft()
    if(chk==0) :
        res = ','.join((s) for s in qu )
        print("["+(res)+"]")
            

리팩토링했는데, 시간초과

import sys
from collections import deque

t= int(sys.stdin.readline())
qu=deque()

for i in range(t):
    p= list(sys.stdin.readline().strip())
    lenp = len(p)
    n= int(sys.stdin.readline().strip())

    qu = deque((sys.stdin.readline().strip("[").strip("]").strip().split(",")))

    for i in range(lenp):
        chk=0
        if p[i]=="R":
            qu=deque(reversed(qu)) #qu=deque(sorted(qu, reverse=True))
        else : 
            if len(qu)==0 or n==0: 
                chk=1
                print("error") 
                break
            else : 
                qu.popleft()
    if(chk==0) :
        res = ','.join((s) for s in qu )
        print("["+(res)+"]")
            

<반성 점>

  • 틀리는 상황이 발생하는데 어딘지 알 수가 없다.

<배운 점>

  • sorted 는 기존의 데이터 구조를 바꾸는 것이 아니라 임시로 반환하는 것, 원본 데이터의 순서는 변하지 않는다.
  • 바뀌게 하려면 reversed 를 쓰도록 해라

0개의 댓글