일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자바
- 제어구조
- 백준
- C#프로그래밍
- 코드업
- VARIABLE
- 코드업100제
- 개발입문
- 사용자입력
- 백준파이썬
- 코드업자바
- 디자인패턴
- 변수
- Algorithm
- 코드업100제자바
- 알고리즘
- SWEA
- 프로그래머스파이썬
- 코딩테스트
- Codeup
- Literal
- 자바클래스
- 자바연산자
- 리터럴
- Java
- c#
- SWEA파이썬
- 수학연산
- C#변수
- 기초프로그래밍
- Today
- Total
제니노트
[백준] 1406 에디터 (python) 본문
1) [백준] 1406 - 에디터 (python)
문제 출처 :
https://www.acmicpc.net/problem/1406
2) 문제
한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다.
이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가 있다.
이 편집기가 지원하는 명령어는 다음과 같다.
커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨) - L |
커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨) - D |
커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨) 삭제로 인해 커서는 한 칸 왼쪽으로 이동한 것처럼 나타나지만, 실제로 커서의 오른쪽에 있던 문자는 그대로임 -B |
$라는 문자를 커서 왼쪽에 추가함 - P $ |
초기에 편집기에 입력되어 있는 문자열이 주어지고, 그 이후 입력한 명령어가 차례로 주어졌을 때, 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 구하는 프로그램을 작성하시오. 단, 명령어가 수행되기 전에 커서는 문장의 맨 뒤에 위치하고 있다고 한다.
입력
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수를 나타내는 정수 M(1 ≤ M ≤ 500,000)이 주어진다. 셋째 줄부터 M개의 줄에 걸쳐 입력할 명령어가 순서대로 주어진다. 명령어는 위의 네 가지 중 하나의 형태로만 주어진다.
출력
첫째 줄에 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력한다.
풀이
시간 제한이 있다. 매우 작음
입력 가능한 명령의 수가 500,000 문자열의 길이는 최대 100,000 이다.
list 는 배열이므로 insert,remove처럼 인덱스 접근함수는 O(n)의 시간복잡도를 가진다.
최악의 경우 최대 문자열 길이 100,000에 대하여 최대 명령수 500,000를 곱한 숫자만큼 연산을 해야함.
따라서 커서 기준으로 해서 문자열을 스택에 두개에 나누었다.
그렇게 하면 appnd,pop 함수로 O(1)의 시간복잡도로 해결가능하다.
참고로 list.reverse는 값을 반환하지 않는다.
따라서 reversed를 사용했다.
3)소스 코드
import sys
st1 = list(sys.stdin.readline().rstrip())
st2 = [] #커서의 오른쪽 리스트
for _ in range(int(sys.stdin.readline())):
command=list(sys.stdin.readline().rstrip().split())
if command[0]== 'B' : #커서 왼쪽 문자 삭제
if st1 : #st1 리스트에 값이있으면
st1.pop() #커서 왼쪽 스택 값 pop
elif command[0] == "L" : #커서 왼쪽으로 옮기기
if st1 : #st1 리스트에 값이 있으면
st2.append(st1.pop()) #커서 오른쪽 스택에 st1의 마지막 값 push
elif command[0] == "D" : #커서 오른쪽으로 옮기기
if st2 : #st2 리스트에 값이 있으면
st1.append(st2.pop()) #커서 왼쪽 스택에 st2의 마지막 값 push
else : #커서 왼쪽에 값 추가하기
st1.append(command[1]) #해당 값 추가
#오른쪽 커서 스택의 값을 거꾸로 해서 st1에 원소형태로 추가
st1.extend(reversed(st2))
#리스트를 문자열 형태로 합쳐서 출력
print(''.join(st1))
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 1158 요세푸스 문제 (python) (0) | 2023.05.23 |
---|---|
[백준] 10845 큐 (python) (0) | 2023.05.23 |
[백준]1874 스택수열 (python) (0) | 2023.05.21 |
[백준] 9012 괄호 (python) (0) | 2023.05.20 |
[백준] 9093번 단어뒤집기 (python) (3) | 2023.05.19 |