Archive

[BOJ] 1406 에디터 본문

공부/Algorithm

[BOJ] 1406 에디터

mariabeetle 2021. 1. 31. 21:49

www.acmicpc.net/problem/1406

 

1406번: 에디터

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

www.acmicpc.net

풀이

  • 처음에는 case로 나누고 조건에 맞게 문자열 추가하는 방법 수행(실패, 시간초과)

    # 실패
    edit_text = str(input())
    edit_text_len = len(edit_text)
    
    cur_pointer = edit_text_len
    command_num = int(input())
    
    for _ in range(command_num):
        command = input().split(' ')
        if command[0] == 'L' and cur_pointer > 0:
            cur_pointer -= 1
        elif command[0] == 'D' and cur_pointer < edit_text_len:
            cur_pointer += 1
        elif command[0] == 'B' and cur_pointer > 0:
            edit_text = edit_text[:cur_pointer-1] + edit_text[cur_pointer:]
            edit_text_len -= 1
            cur_pointer -= 1
        elif command[0] == 'P':
            edit_text = edit_text[:cur_pointer] +command[1] +edit_text[cur_pointer:]
            cur_pointer += 1
            edit_text_len += 1
        else:
            assert("Not L, D, B, P")
    print(edit_text)

     

  • list를 사용한 stack 2개를 사용해 문자열 삽입, 삭제 시 O(1)로 수행.

    from sys import stdin
    
    # 가운데 커서가 있고, left_stack은 오른쪽이 입구, right_stack은 입구가 왼쪽에 있다고 생각
    left_stack = list(input())
    right_stack = []
    
    command_num = int(input())
    for command in stdin:
        # 커서를 왼쪽으로 옮김.
        if command[0] == 'L' and left_stack:
            # 왼쪽 스택의 끝 값 -> 오른쪽 스택에 추가.
            right_stack.append(left_stack.pop())
            
        # 커서를 오른쪽으로 옮김
        elif command[0] == 'D' and right_stack:
            left_stack.append(right_stack.pop())
            
        # 커서 왼쪽 문자열 삭제
        elif command[0] == 'B' and left_stack:
            left_stack.pop()
            
        # 커서 왼쪽에 문자열 추가
        elif command[0] == 'P':
            left_stack.append(command[2])
    
    # right_stack은 거꾸로 출력
    print(''.join(left_stack + right_stack[::-1]))

     

'공부 > Algorithm' 카테고리의 다른 글

[BOJ] 1303. 전쟁-전투  (0) 2021.02.07
[BOJ] 1697 숨바꼭질  (0) 2021.01.31
[BOJ] 스택수열  (0) 2021.01.24
[BOJ] 9012 괄호  (0) 2021.01.24
[BOJ] 10828. 스택  (0) 2021.01.16
Comments