• TOC {:toc}

이 글은 백준 온라인 저지의 5397번 문제를 파이썬(Python)으로 풀이한 것을 모아놓은 글입니다.

일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.

2021.04.28 (Python)

메모리 시간 코드 길이
44600 KB 1260 ms 466 B
단계 시작 시각 끝난 시각 걸린 시간
문제 이해 15:16:12 15:17:35
풀이 생각 15:17:36 15:17:56
코딩 15:19:38 15:28:29
디버깅 21:29:33 21:42:07
import sys
input = lambda: sys.stdin.readline().rstrip()

for _ in range(int(input())):
    m = input().replace("><", "").replace("<>", "")
    bcur = []
    acur = []

    for c in m:
        if c == "-":
            if bcur:
                bcur.pop()
        elif c == "<":
            if bcur:
                acur.append(bcur.pop())
        elif c == ">":
            if acur:
                bcur.append(acur.pop())
        else:
            bcur.append(c)

    print("".join(bcur + acur[::-1]))

아이디어 & 풀이

커서를 기준으로 앞의 글자(bcur)와 뒤의 글자(acur)를 별도의 스택으로 만들어 커서의 동작에 따라 push, pop 한다.

디버그

  • 화살표를 좌우를 하러 번갈아 가면서 왔다 갔다 하면 제자리로 돌아오니까 m = input().replace("><", "").replace("<>", "")<>><를 제거해주었는데 이것 때문에 틀렸다.
    • 좌우 이동 시 커서 앞이나 뒤에 공간이 없어서 이동하지 않을 때에는 좌우 이동한 결과 제자리에 있지 않기 때문에 제거해주면 안 된다.

피드백

  • 만약 커서의 위치가 줄의 마지막이 아니라면, 커서 및 커서 오른쪽에 있는 모든 문자는 오른쪽으로 한 칸 이동한다.
    • 이거 문제 풀이에는 영향이 없긴 한데 대체 무슨 말인지 모르겠다.

2022.03.18

메모리 시간 코드 길이
187600 KB 708 ms 703 B
단계 시작 시각 끝난 시각 걸린 시간
문제 이해 21:10:01 21:12:26
풀이 생각 21:12:28 21:13:48
코딩 21:13:51 21:31:10
const fs = require("fs");
const input = fs.readFileSync('/dev/stdin').toString().split('\n');

const [T, ...E] = input;

function main(L) {
    const left = [];
    const right = [];

    for (const c of L) {
        if (c === "<") {
            if (left.length) {
                right.push(left.pop());
            }
        } else if (c === ">") {
            if (right.length) {
                left.push(right.pop());
            }
        } else if (c === "-") {
            if (left.length) {
                left.pop();
            }
        } else {
            left.push(c);
        }
    }
    return [...left, ...right.reverse()].join("");
}

E.forEach((L) => {
    console.log(main(L));
});