에디터

bird.j·2021년 7월 19일
0

백준

목록 보기
2/76

백준 1406

  • 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다.
  • 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가 있다.
  • 명령어내용
    L커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨)
    D커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨)
    B커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨)
    P $$라는 문자를 커서 왼쪽에 추가함
  • 명령어가 수행되기 전에 커서는 문장의 맨 뒤에 위치하고 있다.
  • 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열 구하기


접근 방식

Q. cursor라는 커서의 위치를 나타내는 변수가 필요할 것인데, 커서가 맨 앞과 뒤가 아닌 가운데에 있다면 그 자리에 어떻게 문자를 추가할 것인가?
str형식은 추가가 안되고, 리스트 형식에서는 앞 뒤만 삽입 삭제가 가능한데 가운데는 어떻게 해결할 것인가??

알게된 점

커서 변수를 두고 인덱스를 움직이는 것이 아니라 스택 두개를 사용해서 마치 커서가 왼쪽으로 혹은 오른쪽으로 움직인 것 처럼 만든다.

  • 입력받은 문자열을 리스트화 하여 이를 하나의 스택으로 본다. => word
  • 커서를 왼쪽으로 옮기기 => word에서 pop해서 tmp라는 새로운 스택에 넣는다.
  • 커서를 오른쪽으로 옮기기 => tmp에서 pop해서 다시 word에 붙인다.
  • 마지막에, word와 tmp에서 원소를 pop하여 차례로 붙인 문자열이 정답이다.


코드

word = list(sys.stdin.readline().strip()) #문자열 입력받는 동시에 리스트로 만들기
n = int(sys.stdin.readline().strip())

tmp = []

for _ in range(n):
    command = sys.stdin.readline().strip()
    if command[0] == 'P':
        word.append(command[2])
    elif command[0] == 'L':
        if word:
            tmp.append(word.pop())
    elif command[0] == 'D':
        if tmp:
            word.append(tmp.pop())
    elif command[0] == 'B':
        if word:
            word.pop()

print(''.join(word) + ''.join(tmp)[::-1])
  • 기본적으로 readline()은 개행문자(줄 바꿈 문자)를 포함하고 있다. 그래서 문자열 마지막에 개행문자가 포함되어 출력되기 때문에 이러한 공백 없이 출력할 수 있도록 strip()사용

0개의 댓글