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
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[Python] 백준 17413 단어 뒤집기2 (0) | 2022.12.14 |
---|---|
[Python] 백준 1717 집합의 표현 (0) | 2022.12.13 |
[Python] 백준 1991 트리 순회 (0) | 2022.12.10 |
[Python] 백준 1967 트리의 지름 (0) | 2022.12.10 |
[Python]백준 1167 트리의 지름 (0) | 2022.12.10 |
댓글