본문 바로가기
알고리즘/[python] 백준 BOJ

[Python] 백준 1406 에디터

by Alan_Kim 2022. 12. 12.
728x90
반응형

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

 

1406번: 에디터

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

www.acmicpc.net

 

문제 해결 방법

- 커서의 위치를 i (0<=i<=n)으로 두고 옮겨 다니면서 주어진 명령어를 실행하려고 했다.

 

CODE

import sys
input = sys.stdin.readline

if __name__=="__main__":
    s =str(input().strip())
    n = len(s)
    i = n
    for _ in range(int(input())):
        T = list(input().split())
        if len(T) == 2:
            s = s[:i] + str(T[-1]) +s[i:]
            i += 1
            n += 1
        elif T[0] == "L":
            if i==0:
                pass
            else:
                i -= 1
        elif T[0] == "D":
            if i>=n:
                pass
            else:
                i +=1
        elif T[0] == "B":
            if i==0:
                pass
            else:
                s = s[:i-1] + s[i:]
                i -= 1
                n -= 1
    print(s)

결과는 시간초과

"P" 명령문과 "B" 명령어를 쓸 때 주어진 i 인덱스에 따라 문자를 삽입, 제거 하는데 시간이 상당히 소요된 것으로 생각된다.

그러면 인덱스를 생각하지 않고 풀 수 있는 방법이 있을까?

나는 생각을 못했지만 다른 사람의 풀이를 통해 많이 배울 수 있었다.

바로 커서를 고정하고 왼쪽, 오른쪽에 스택을 놓고 옮기거나 지우거나 삭제하면 되는 전략을 썼기 때문이다.

 

CODE

import sys
input = sys.stdin.readline

if __name__=="__main__":
    s_1 = list(input().strip())
    s_2 = []

    for _ in range(int(input())):
        c = list(input().split())
        if c[0] == "L":
            if s_1:
                s_2.append(s_1.pop())
        elif c[0] == "D":
            if s_2:
                s_1.append(s_2.pop())
        elif c[0] == "B":
            if s_1:
                s_1.pop()
        else:
            s_1.append(c[1])
    s_1.extend(reversed(s_2))
    print(''.join(s_1))

인덱스를 고려하지 않고 마지막에 reversed() 하나 사용하였다.

728x90
반응형

댓글