-
5397. [Python]키로거Python_알고리즘/Silver II 2023. 8. 11. 16:22
1. 문제
https://www.acmicpc.net/problem/5397
5397번: 키로거
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백스페이스를 입
www.acmicpc.net
2. 접근 방법
- 시간 제한: 1초
- 메모리 제한: 256MB
- 스택
3. 파이썬 코드
import sys # 많은 인풋 처리 input = sys.stdin.readline T = int(input()) for _ in range(T): # 인풋값 공백 제거 후 words = input().strip() # 왼쪽 리스트 오른쪽 리스트 생성 left_list, right_list = [], [] # 반복문을 진행하며 for word in words: # 만약 < 움직임이면 left 리스트 값이 있으면 right 리스트에 값추가 if word == "<": if left_list: right_list.append(left_list.pop()) # 만약 > 움직임이면 right 리스트 값이 있으면 left 리스트에 값추가 elif word == ">": if right_list: left_list.append(right_list.pop()) # 만약 - 이면 left 리스트 값이 있으면 pop elif word == "-": if left_list: left_list.pop() # left 리스트에 값을 계속 추가 else: left_list.append(word) # right 리스트 값이 없어질때 까지 뽑아서 왼쪽 리스트에 값추가 while right_list: left_list.append(right_list.pop()) print("".join(left_list))
4. 문제를 풀고난 후 생각
- 처음 시도했던 방식으로는
더보기import sys input = sys.stdin.readline T = int(input()) for _ in range(T): words = input() current_pos= 0 ans = [] for word in words: if word == "<": current_pos -= 1 if current_pos < 0: current_pos = 0 elif word == "-": if ans: ans.pop(current_pos-1) if current_pos == len(ans)+1: current_pos -=1 else: if word != ">": ans.insert(current_pos,word) current_pos += 1 if current_pos >= len(ans): current_pos = len(ans) answer = "".join(ans) print(answer)
- 이런 방식으로 코드를 짰으며 커서가 나올때마다 current_pos 라는 변수를 통해서 현재 위치를 계속해서 찾아주는 방법을 선택했다. 하지만 insert를 사용하면 시간복잡도가 높아지기 때문에 다른 방식을 생각하는 도중 도저히 모르겠어서 인터넷 검색을 통해서 left_list 와 right_list 두개를 생성하여 접근하는 방식을 보고 구현해봤다.
- 내가 생각했던 insert 를 사용하는 것보다 pop 을 사용하면 시간복잡도가 훨씬 줄어들었고, 그에 따른 구현도 매우 간단해졌다. "<", ">" 경우만 리스트를 왼쪽 오른쪽 으로 이동시키면 끝났다.
- 이후 모든 값들은 왼쪽 리스트에서 계산을 시행했고, 끝나면 오른쪽 리스트의 값들을 모두 왼쪽에 추가해줬다. ( 아마 많아도 1개만 남아있을 것이다. 맨 마지막값 )
5. 문제를 푸는데 도움이 되는 지식
- 스택
- 자료구조
'Python_알고리즘 > Silver II' 카테고리의 다른 글
1012. [Python]유기농 배추 (0) 2023.08.19 1564. [Python]팩토리얼5 (0) 2023.08.13 1260. [Python]DFS와 BFS (0) 2023.08.08 1874. [Python]스택 수열 (0) 2023.08.07 1541. [Python]잃어버린 괄호 (0) 2023.08.06