-
[Python] BOJ 5397 : 키로거코딩테스트/백준 2024. 10. 16. 08:25
https://www.acmicpc.net/problem/5397 <- 키로거 문제
https://studyiwthme.tistory.com/169 <- 백준 에디터 1406과 똑같다.
요구사항
- 시간제한 1초 L이 1,000,000 이므로 테스트 케이스가 몇 개라고 말이 없어서.. 이중 for문을 최대한 피하려다가 그냥 이중 for문을 사용하기로 생각했다.
- 메모리제한 256MB 역시 걱정할 정도는 아니다.
- 알파벳, 숫자, 백스페이스, 화살표가 주어졌을 때, 최종 문자열을 출력해라.
설계
- testCase 를 입력 받는다..
- 사용자로 부터 입력을 받는다.
- 커서 기준 왼쪽과 오른쪽을 나누기 위해서 2개의 리스트를 초기화한다.
- 입력 받는 문자열에 대해 for문을 돌린다.
- 각 케이스 별로 if문을 사용해서 나눈다.
- "<" 일 때
- 커서 기준 왼쪽이 뭘 있어야 커서를 움직을 수 있잖아요. 그래서 if leftStack:
- 커서가 왼쪽으로 움직이면, 예를 들어 abc| ( | 는 커서입니다.) ab|c 이렇게 됩니다. 그러면 커서 기준으로 오른쪽에 c가 들어갔죠. 따라서 오른쪽스택.append(왼쪽스택.pop()) 을 해줍니다.
- ">" 일 떄는 반대이고 나머지도 한번 생각해보세요.
- "<" 일 때
- 출력할 떄 join 메서드를 사용하고 왼쪽 스택 + 오른쪽 스택은 역순으로
실수
만약 커서의 위치가 줄의 마지막이 아니라면, 커서 및 커서 오른쪽에 있는 모든 문자는 오른쪽으로 한 칸 이동한다.
문제에서 위 문장을 출력할 때 커서가 마지막이 아니라면 커서 기준 왼쪽과 오른쪽을 붙일 때, 한칸 띄우라는 말로 해석을 했다.
예를 들어 ab|c 일때 ab c 이렇게 출력인줄..
구현
import sys input = lambda: sys.stdin.readline().rstrip() N = int(input()) for _ in range(N): password = input() leftStack = [] rightStack = [] for str in password: if str == "<": if leftStack: rightStack.append(leftStack.pop()) elif str == ">": if rightStack: leftStack.append(rightStack.pop()) elif str == "-": if leftStack: leftStack.pop() else: leftStack.append(str) print("".join(leftStack + rightStack[::-1]))
- 위 소스 코드를 and 메서드를 이용해 한 줄로 할 수 있지만, 개인적으로 저게 더 가독성이 좋아보인다.
'코딩테스트 > 백준' 카테고리의 다른 글
[Python] BOJ 17298 : 오큰수 (0) 2024.10.19 [Python] BOJ 1158 : 요세푸스 문제 (0) 2024.10.17 [Python] BOJ 6198 : 옥상 정원 꾸미기 (0) 2024.10.15 [Python] BOJ 1406 : 에디터 (0) 2024.10.14 [Python] BOJ 11328 : Strfry (0) 2024.10.11