[Algorithm] 백준 5397 - 키로거 in Python(파이썬)

하이초·2022년 7월 25일
0

Algorithm

목록 보기
31/94
post-thumbnail

💡 백준 5397:

스택 기본 구조 활용

🌱 코드 in Python

알고리즘: Stack

import sys

input = sys.stdin.readline
t = int(input())
for i in range(t):
	tmp = input().rstrip()
	pwd = [] # 비밀번호 배열
	sub = [] # 커서 이동 시 담아놓을 배열
	for a in tmp:
		if a == '<': # 왼쪽 커서일 때
			if pwd: # pwd가 존재할 경우에만
				sub.append(pwd.pop()) # pop 후 sub 배열에 넣기
		elif a == '>': # 오른쪽 커서일 때
			if sub: # sub가 존재할 경우에만
				pwd.append(sub.pop()) # pop 후 pwd 배열에 넣기
		elif a == '-': # - 일 때
			if pwd: # pwd가 존재할 경우에만
				pwd.pop() # pwd pop하여 삭제
		else:
			pwd.append(a) # 위의 3가지 문자 외 어느 문자든 전부 pwd에 삽입
	print("".join(pwd),"".join(sub[::-1]),sep="")

이번 문제는 사실 첨에 한글 이해하는 게 가장 어려웠다 ㅎㅂㅎ...

만약 커서의 위치가 줄의 마지막이 아니라면, 커서 및 커서 오른쪽에 있는 모든 문자는 오른쪽으로 한 칸 이동한다

이부분 보고 팍씌 뭔 말이야,,, 하며 인상 찌푸림..

나만 띨빡일 수 있지만, 혹시 또 이걸로 머리 싸매고 계실 분이 한 분이라도 더 있을 수 있으니..
굳이 설명을 하자면 걍 커서를 어느 위치로 이동하든,
즉, 왼쪽이든 오른쪽이든 커서를 이동하게 될 경우 그 커서 위치부터 새 문자를 쓰겠다 그 말이다


나는 처음 써나가는 문자를 기록하며 결국 결과 배열이 될 pwd 배열과 커서 이동에 따라 뒤로 옮겨져야 할 문자를 저장할 sub 배열을 만들어 문제를 풀었다

sub 배열은 먼저 입력 된 문자가 pwd배열에 문자가 있다 치고!를 가능하게 해주는 배열이다
다시 말해, 커서 이동 후 커서가 어디에 있는 지 기억해주는 역할을 해주는 것이다

'<'의 경우에 pwd 배열에 값이 있어야만 유효한 문자이며,
pwd 배열의 길이가 커서가 왼쪽으로 이동할 수 있는 길이라고 볼 수 있다

'>'의 경우에는 그 뒤로 적을 문자들을 모아놓은 sub 배열에 값이 있어야만 유효한 문자이며,
sub 배열의 길이가 커서가 오른쪽으로 이동할 수 있는 길이이다

스택이 FIFO구조이다 보니 pwd <-> sub가 서로 주고받으며
결국 pwd 배열에는 입력 순서대로 문자가 들어갈 수 있게 된다


🧠 기억하자

  1. 리스트를 합치는 다양한 방법
    • ret = a + b
    • a.append(b)
      • b의 원소가 그대로 하나의 값으로 추가 됨
        • a = [1, 2, 3], b = [[4, 5]] -> a = [1, 2, 3, [4, 5]]
        • a = [1, 2, 3], b = ['hi'] -> a = [1, 2, 3, 'hi]
    • a.extend(b)
      • iterable 요소 하나하나가 개별로 추가
        • a = [1, 2, 3], b = [[4,5]] -> a = [1, 2, 3, 4, 5]
        • b = [1, 2, 3], b = ['hi'] -> a = [1, 2, 3, 'h', 'i']

백준 5397 바로가기

profile
개발국대가 되는 그 날까지. 지금은 개발 응애.

0개의 댓글