본문 바로가기
Algorithm/스택&큐&덱&힙

[백준] 1406번 에디터

by HANNI하니 2023. 1. 16.

사용 언어 - Python3

1406번: 에디터 (실버2, 자료구조-스택)

문제 LG CNS 22년 상반기 코테랑 유사

 

1406번: 에디터

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

www.acmicpc.net

 

정답

Stack 문제 + 시간복잡도 반영

내 정답은 시간복잡도를 반영하지 못하여 시간초과로 오답처리되었다. 테스트셋을 출력했을 땐 다 정답으로 나오긴 했다.

insert() 명령어도 시간복잡도가 O(N)으로 높기 때문에 사용할 수 없다.

list형태로 append와 pop만을 이용하면 O(1)으로 시간복잡도를 반영할 수 있다. -> 스택개념을 사용해야한다.

# 내 정답 - 시간초과
A = str(input()).lower() #입력 문자열
M = int(input()) #명령어 개수
C = len(A)+1 #커서 위치

order = []
for i in range(M):
    order.append(list(map(str,input().split())))


for i in range(M):
    if C < 0 :
        C = 0
    elif C >= len(A):
        C = len(A)
        
    if order[i] == ['L']:
        C -= 1
    elif order[i] == ['D']:
        C += 1
    elif order[i] == ['B']:
        if C <= 1 :
            A = A[C:]
            C -= 1
        else:
            C -= 1
            A = A[:C]+ A[C+1:]
    
    elif order[i][0] == 'P':
        A = A[:C]+ order[i][-1] + A[C:]
        C += 1
        
print(A)

(정답 풀이)

1. 왼쪽에 입력값을, 오른쪽에 빈 리스트를 만든다.

2. 첫 커서는 오른쪽 마지막에 있다.

3. L이 커서를 왼쪽으로 간다는 뜻은 반대방향으로 리스트를 만든다는 뜻이기 때문에 stack_l의 가장 오른쪽 원소부터 stack_r에 추가한다. stack_l은 가장 오른쪽 값을 계속 빼내기 때문에 커서의 위치는 자동으로 가장 오른쪽 마지막으로 리셋된다.

(예) stack_l=[a,b,c,d], stack_r=[] ~> L 3번 입력 ~> stack_l=[a], stack_r=[d,c,b]

새로운 리스트에 인덱스를 정반대로 저장해주면서, 커서는 새롭게 자동으로 가장 마지막 값으로 업데이트 되는 형태.

결론적으로 출력할 때만 stack_r을 reverse하면 되는 구조!

4. D는 L과 정반대 값이다. 다시 stack_r의 가장 오른쪽 원소(가장 마지막에 들어간 원소)를 빼서 stack_l로 append한다.

(예) stack_l=[a], stack_r=[d,c,b] ~> D 1번 입력 ~> stack_l=[a,b], stack_r=[d,c]

5. B는 stack_l의 가장 마지막 원소값을 제거한다. pop() 명령어 사용

(예) stack_l=[a,b], stack_r=[d,c] ~> B 1번 입력 ~> stack_l=[a], stack_r=[d,c]

6. P는 명령어의 두번째 값을 stack_l에 추가한다.

(예) stack_l=[a], stack_r=[d,c] ~> P x 입력 ~> stack_l=[a,x], stack_r=[d,c]

7. stack_l을 먼저 출력하고 stack_r을 reverse하여 list 형태로 출력하면 끝!

(예) [a,x,c,d]

8. pop 하는 리스트에 원소가 있어야 오류가 안나기 때문에 if문에서 "and stack_l" 처럼 확인해준다.

import sys
stack_l = list(input()) #입력문자열. list 형태여야 pop() 가능하기 때문
stack_r = [] #빈리스트
n = int(input()) #명령어 개수

for i in range(n):
    command = sys.stdin.readline().split() #명령어 입력
    
    #각 조건문 실행
    if command[0] == 'L' and stack_l:
        stack_r.append(stack_l.pop())
    elif command[0] == 'D' and stack_r:
        stack_l.append(stack_r.pop())
    elif command[0] == 'B' and stack_l:
        stack_l.pop()
    elif command[0] == 'P':
        stack_l.append(command[1])
   
print("".join(stack_l+list(reversed(stack_r))))

레퍼런스

  • stack 사용한 정답 풀이
 

[백준] 에디터 1406번 파이썬 Python 자료구조

밑의 코드는 이 문제를 보고 처음 문제를 푼 코드다.cursor라는 변수를 만들어서 커서의 위치를 나타내도록 했다.그걸 사용하기 위해서 pop(), insert()를 사용했다.시간초과가 계속 나와서 구글링 해

velog.io

  • 비슷한 풀이
 

[백준] 알고리즘 1406번 - python 풀이

https://www.acmicpc.net/problem/1406 1406번: 에디터 문제 한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다. 이 편

bnzn2426.tistory.com

  • 정답 깃허브
 

GitHub - yyeongeun/codingtest: 코딩테스트 공부

코딩테스트 공부. Contribute to yyeongeun/codingtest development by creating an account on GitHub.

github.com

 

'Algorithm > 스택&큐&덱&힙' 카테고리의 다른 글

[백준] 1874번 스택 수열  (0) 2023.01.20
[백준] 9012번 괄호  (0) 2023.01.20
[백준] 10773번 제로  (0) 2023.01.20
[백준] 10828번 스택  (0) 2023.01.20
[백준] 4949번 균형잡힌 세상  (0) 2023.01.16

댓글