공부하기/백준

[Python] 백준 풀기 1406 - 에디터

XEV 2022. 11. 8. 22:58

파이썬 백준 1406번

실버2

https://www.acmicpc.net/problem/1406

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 자료 구조, 스택, 연결 리스트

 

 

 

 

 

문제 풀기

커서의 위치를 리스트 분할 위치로 정하고 각 명령어가 들어올 때마다 왼쪽 오른쪽으로 잘라서 저장하였다.

list 보다 시간 복잡도에서 유리한 deque 를 사용하여 매번 주어진 명령에 대해 문자 위치를 변경하였다.

(물론 list 를 사용하여 append, pop 으로 작성할 수도 있지만 deque 를 사용하여 순서대로 직관적이고 깔끔하게 표현하고 싶었음)

 

 

deque() 로 초기 문자열을 하나하나 나누어 저장한다.

    characters_ls = deque(map(str, inputdata().strip()))

 

명령의 횟수를 M 에 저장하고, 왼쪽과 오른쪽 두 개의 deque 를 생성하고 임시 저장용 변수도 하나 지정한다. 초기 커서의 위치는 맨 오른쪽에서 시작함으로 왼쪽 deque 에는 입력으로 부여된 문자열을 넣어 초기화시킨다.

    M = int(inputdata().strip())

    chars_left = characters_ls
    char_temp = ''
    chars_right = deque()

 

for loop 을 작동시키면서 매번 명령을 받아 리스트 형태로 저장한 후, index == 0 에 해당하는 명령 문자에 대한 조건문을 나누어 준다. 이때, 커서가 맨 오른쪽 또는 왼쪽에 위치하게 되었을 때에는 문자열에 아무런 변화가 일어나지 않기에 len(chars_left) != 0 또는 len(chars_right) != 0 일 때에만 작동하도록 한다.

    for i in range(M):
        command = list(map(str, inputdata().split()))
        if command[0] == 'L' and len(chars_left) != 0:
            char_temp = chars_left.pop()
            chars_right.appendleft(char_temp)
        elif command[0] == 'D' and len(chars_right) != 0:
            char_temp = chars_right.popleft()
            chars_left.append(char_temp)
        elif command[0] == 'B' and len(chars_left) != 0:
            chars_left.pop()
        elif command[0] == 'P':
            chars_left.append(command[1])

 

for loop 이 끝나고 나면 왼쪽 chars_left 과 오른쪽 chars_right 에 문자열이 커서 위치에 분할된 상태로 저장되어있다.

따라서 이 둘을 합쳐서 프린트하여 출력 결과를 얻는다.

    for c in chars_left:
      print(c, end='')
    for c in chars_right:
      print(c, end='')

 

 

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline
from collections import deque

def fnCommandMachine(characters_ls):
    M = int(inputdata().strip())
    chars_left = characters_ls
    char_temp = ''
    chars_right = deque()
    
    for i in range(M):
        command = list(map(str, inputdata().split()))
        if command[0] == 'L' and len(chars_left) != 0:
            char_temp = chars_left.pop()
            chars_right.appendleft(char_temp)
        elif command[0] == 'D' and len(chars_right) != 0:
            char_temp = chars_right.popleft()
            chars_left.append(char_temp)
        elif command[0] == 'B' and len(chars_left) != 0:
            chars_left.pop()
        elif command[0] == 'P':
            chars_left.append(command[1])

    for c in chars_left:
      print(c, end='')
    for c in chars_right:
      print(c, end='')


if __name__ == "__main__":
    characters_ls = deque(map(str, inputdata().strip()))
    
    fnCommandMachine(characters_ls)

 

 

 

 

추가 하기

예제 입력 1

import sys
inputdata = sys.stdin.readline
from collections import deque

def fnCommandMachine(characters_ls):
    M = int(inputdata().strip())
    chars_left = characters_ls
    char_temp = ''
    chars_right = deque()
    for i in range(M):
        command = list(map(str, inputdata().split()))
        if command[0] == 'L' and len(chars_left) != 0:
            char_temp = chars_left.pop()
            chars_right.appendleft(char_temp)
            print(f'[L] chars_left:  {chars_left}')             # test print
            print(f'[L] chars_right: {chars_right}')            # test print
        elif command[0] == 'D' and len(chars_right) != 0:
            char_temp = chars_right.popleft()
            chars_left.append(char_temp)
            print(f'[D] chars_left:  {chars_left}')             # test print
            print(f'[D] chars_right: {chars_right}')            # test print
        elif command[0] == 'B' and len(chars_left) != 0:
            chars_left.pop()
            print(f'[B] chars_left:  {chars_left}')             # test print
            print(f'[B] chars_right: {chars_right}')            # test print
        elif command[0] == 'P':
            chars_left.append(command[1])
            print(f'[P] chars_left:  {chars_left}')             # test print
            print(f'[P] chars_right: {chars_right}')            # test print
        print(' ')          # test print
        
    print(f'chars_left:  {chars_left}')             # test print
    print(f'chars_right: {chars_right}')            # test print

    for c in chars_left:
      print(c, end='')
    for c in chars_right:
      print(c, end='')


if __name__ == "__main__":
    characters_ls = deque(map(str, inputdata().strip()))
    print(characters_ls)            # test print
    
    fnCommandMachine(characters_ls)



# abcd
# 3
# P x
# L
# P y


# deque(['a', 'b', 'c', 'd'])

# [P] chars_left:  deque(['a', 'b', 'c', 'd', 'x'])
# [P] chars_right: deque([])
 
# [L] chars_left:  deque(['a', 'b', 'c', 'd'])
# [L] chars_right: deque(['x'])
 

# [P] chars_left:  deque(['a', 'b', 'c', 'd', 'y'])
# [P] chars_right: deque(['x'])
 
# chars_left:  deque(['a', 'b', 'c', 'd', 'y'])
# chars_right: deque(['x'])


# abcdyx

 

 

 

예제 입력 2

import sys
inputdata = sys.stdin.readline
from collections import deque

def fnCommandMachine(characters_ls):
    M = int(inputdata().strip())
    chars_left = characters_ls
    char_temp = ''
    chars_right = deque()
    for i in range(M):
        command = list(map(str, inputdata().split()))
        if command[0] == 'L' and len(chars_left) != 0:
            char_temp = chars_left.pop()
            chars_right.appendleft(char_temp)
            print(f'[L] chars_left:  {chars_left}')             # test print
            print(f'[L] chars_right: {chars_right}')            # test print
        elif command[0] == 'D' and len(chars_right) != 0:
            char_temp = chars_right.popleft()
            chars_left.append(char_temp)
            print(f'[D] chars_left:  {chars_left}')             # test print
            print(f'[D] chars_right: {chars_right}')            # test print
        elif command[0] == 'B' and len(chars_left) != 0:
            chars_left.pop()
            print(f'[B] chars_left:  {chars_left}')             # test print
            print(f'[B] chars_right: {chars_right}')            # test print
        elif command[0] == 'P':
            chars_left.append(command[1])
            print(f'[P] chars_left:  {chars_left}')             # test print
            print(f'[P] chars_right: {chars_right}')            # test print
        print(' ')          # test print
        
    print(f'chars_left:  {chars_left}')             # test print
    print(f'chars_right: {chars_right}')            # test print

    for c in chars_left:
      print(c, end='')
    for c in chars_right:
      print(c, end='')


if __name__ == "__main__":
    characters_ls = deque(map(str, inputdata().strip()))
    print(characters_ls)            # test print
    
    fnCommandMachine(characters_ls)



# dmih
# 11
# B
# B
# P x
# L
# B
# B
# B
# P y
# D
# D
# P z


# deque(['d', 'm', 'i', 'h'])

# [B] chars_left:  deque(['d', 'm', 'i'])
# [B] chars_right: deque([])
 
# [B] chars_left:  deque(['d', 'm'])
# [B] chars_right: deque([])
 
# [P] chars_left:  deque(['d', 'm', 'x'])
# [P] chars_right: deque([])
 
# [L] chars_left:  deque(['d', 'm'])
# [L] chars_right: deque(['x'])
 
# [B] chars_left:  deque(['d'])
# [B] chars_right: deque(['x'])
 
# [B] chars_left:  deque([])
# [B] chars_right: deque(['x'])
 
# [P] chars_left:  deque(['y'])
# [P] chars_right: deque(['x'])
 
# [D] chars_left:  deque(['y', 'x'])
# [D] chars_right: deque([])
 
# [P] chars_left:  deque(['y', 'x', 'z'])
# [P] chars_right: deque([])
 
# chars_left:  deque(['y', 'x', 'z'])
# chars_right: deque([])


# yxz