[Python] 백준 #5397- 키로거

2022. 1. 25. 00:46·코딩테스트/백준[Python]

문제


 

5397번: 키로거

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백스페이스를 입

www.acmicpc.net

코드


My answer

from collections import deque
T = int(input())
for _ in range(T):
    L = input()
    left = deque()
    right = deque()
    for i in L:
        if(i=="<"):
            if(len(left)!=0):
                right.appendleft(left.pop())
        elif(i==">"):
            if(len(right)!=0):
                left.append(right.popleft())
        elif(i=="-"):
            if(len(left)!=0):
                left.pop()
        else:
            left.append(i)
    print(''.join(left+right))
import sys
input=sys.stdin.readline

t_c=int(input())

for _ in range(t_c):
    log=input().rstrip()
    answer,tmp=[],[]
    for i in log:
        answer.append(i)
        if(answer[-1] in ['>','<','-']):
            now=answer.pop()
            if(now=='<'):
                if(answer==[]):continue
                tmp.append(answer.pop())
            elif(now=='>'):
                if(tmp==[]):continue
                answer.append(tmp.pop())
            else:
                if(answer==[]):continue
                answer.pop()
    while(tmp!=[]):answer.append(tmp.pop())
    answer="".join(answer)
    print(answer)

Another answer

from collections import deque
T = int(input())
for _ in range(T):
    L = input()
    left = deque()
    right = deque()
    for i in L:
        if(i=="<"):
            if(len(left)!=0):
                right.appendleft(left.pop())
        elif(i==">"):
            if(len(right)!=0):
                left.append(right.popleft())
        elif(i=="-"):
            if(len(left)!=0):
                left.pop()
        else:
            left.append(i)
    print(''.join(left+right))

풀이


my answer 첫번째 방법의 경우에는 스택2개를 이용하여 구현하였다. 우선 방향키가 갈 수 있는지 없는지를 판단하고, 

왼쪽 방향키가 나올 경우, 중간에 삽입하여 입력해야하기 때문에 우선 왼쪽의 마지막껄 오른쪽 스택으로 넘겨주고, 

오른쪽 방향키가 나올경우 오른쪽 스택에 저장해뒀던걸 다시 왼쪽으로 옮겨주고

백스페이스가 나올경우 왼쪽에서 하나 지워줬다,

최종적으로 오른쪽에 남아있는 것들을 모두 왼쪽으로 옮겨줬다. 

 

두 번째 방법은 두개의 큐로 구현을 하였다. 아이디어는 위와 동일하고, popleft와 appendleft를 이용하기 위하여 큐를 사용하여 구현하였다.

 

아이디어는 "ab<ce>df-" 라는 로그가 주어졌다고 할 때,

우선 ab는 바로 스택에 들어가고, 왼쪽 방향키가 나왔으므로, a와 b사이에 다음 문자들을 기록해야 하기 때문에 b를 오른쪽 스태겡 넣어준다.

현재 방향키는 a뒤에 있으므로, ce를 그대로 입력하고( 현재 ace 왼쪽/ b 오른쪽) 이번엔 오른쪽 키가 나왔으므로, 오른쪽 스택에 있던 b를 복귀시켜준다. (삽입이 마무리 되었다는 의미) 최종적으로 d와 f를 입력하고 -가 한번 들어오기 때문에 정답은 acebd가 될 것이다.

조건들만 잘 살펴주면 쉽게 해결할 수 있을 것 같다.

 

728x90

'코딩테스트 > 백준[Python]' 카테고리의 다른 글

[Python] 백준 #1302 - 베스트셀러  (0) 2022.03.01
[Python] 백준 #11729 - 최대 힙  (0) 2022.02.28
[Python] 백준 #1021- 회전하는 큐  (0) 2022.01.23
[Python] 백준 #1966- 프린터 큐  (0) 2022.01.23
[Python] 백준 #2776- 암기왕  (0) 2022.01.23
'코딩테스트/백준[Python]' 카테고리의 다른 글
  • [Python] 백준 #1302 - 베스트셀러
  • [Python] 백준 #11729 - 최대 힙
  • [Python] 백준 #1021- 회전하는 큐
  • [Python] 백준 #1966- 프린터 큐
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (481)
      • 알쓸신잡 (88)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Blog

    • 🏠 Home

    ✏️글쓰기
    💻 관리

    Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    이코테
    DFS
    이분탐색
    그리디
    파이썬
    dp
    이것이취업을위한코딩테스트다
    나동빈
    백준
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상단으로

티스토리툴바