땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • 이것이 리눅스다 with Rocky Linux9
  • I
  • E
  • ㅗ
  • D

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 1406 에디터

2021. 10. 19. 19:47

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

 

1406번: 에디터

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

www.acmicpc.net

스택에 대해 새롭게 접근할 수 있는 재밌는 문제라 다시 정리를 해보려고 한다.

 

문제를 처음 접근했을땐 단순 구현문제로 접근하여 아래와 같이 코딩을 하였으나 

시간 초과가 되어버렸다.

data = list(map(str,input()))
n = int(input())
cursor = len(data)

for _ in range(n):
    x = input().split()

    if x[0] == 'L' and cursor != 0:
        cursor -= 1

    elif x[0] == 'D' and cursor != len(data):
        cursor += 1

    elif x[0] == 'B' and cursor != 0:
            del data[cursor-1]
            cursor -= 1

    elif x[0] == 'P':
        data.insert(cursor,x[1])
        cursor += 1

print(''.join(data))

 

시간 복잡도를 계산해봤는데 list에 insert(), del가 O(n)이라는 사실을 알고 O(1)인 append(), pop()으로 바꾸기로 하였다.

 

커서를 왼쪽으로 옮긴다는 의미는 삭제가 아니라 잠시 기억해놨다가 다시 꺼낼수있다는 의미이고

오른쪽으로 옮긴다는 의미도 잠시 기억해놨다가 언제든 다시 꺼낼수있다는 의미이다.

즉, stack 2개를 이용해서 풀어 나갈 수 있다는 점이다!

 

import sys

stack1 = list(sys.stdin.readline().strip())
stack2 = []
n = int(sys.stdin.readline())
cursor = len(stack1)

for _ in range(n):
    x = sys.stdin.readline().split()

    if x[0] == 'L' and stack1 != []:
        stack2.append(stack1.pop())

    elif x[0] == 'D' and stack2 != []:
        stack1.append(stack2.pop())

    elif x[0] == 'B' and stack1 != []:
        stack1.pop()

    elif x[0] == 'P':
        stack1.append(x[1])

print(''.join(stack1 + list(reversed(stack2))))

시간을 최대한 빠르게 하기위해 sys 라이브러리를 사용했으며 stack != []는 그 스택이 비어있으면 

 

append 및 pop이 안되기때문에 이를 방지해놓은 조건이다.

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 6064 카잉 달력  (0) 2021.11.04
백준 17427 약수의 합2  (0) 2021.11.02
##백준 15990 1, 2, 3 더하기5  (0) 2021.10.29
백준 11052 카드 구매하기  (0) 2021.10.29
백준 1018 체스판 다시 칠하기  (0) 2021.10.13
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 17427 약수의 합2
    • ##백준 15990 1, 2, 3 더하기5
    • 백준 11052 카드 구매하기
    • 백준 1018 체스판 다시 칠하기
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바