파이썬 백준 1406번
실버2
https://www.acmicpc.net/problem/1406
문제 보기
분류: 자료 구조, 스택, 연결 리스트
문제 풀기
커서의 위치를 리스트 분할 위치로 정하고 각 명령어가 들어올 때마다 왼쪽 오른쪽으로 잘라서 저장하였다.
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
'공부하기 > 백준' 카테고리의 다른 글
[Python] 백준 풀기 1152 - 단어의 개수 (0) | 2022.11.10 |
---|---|
[Python] 백준 풀기 1157 - 단어 공부 (0) | 2022.11.09 |
[Python] 백준 풀기 9095 - 1, 2, 3 더하기 (0) | 2022.11.07 |
[JavaScript] 백준 풀기 2438 - 별 찍기 - 1 (0) | 2022.11.06 |
[Python] 백준 풀기 1874 - 스택 수열 (0) | 2022.11.05 |