[JavaScript] 백준 5397 키로거 (JS)

SanE·2024년 2월 8일

Algorithm

목록 보기
43/127

쇠막대기

📚 문제 설명


입력으로 문자열을 받고 특정 문자열에 따라 명령을 실행하는 문제이다.

  • < 가 들어오면 커서를 왼쪽으로 이동
    • 왼쪽에 값이 없으면 무시
  • > 가 들어오면 커서를 오른쪽으로 이동
    • 오른쪽에 값이 없으면 무시
  • - 가 들어오면 커서 왼쪽 값 제거
  • 그외의 문자열은 모두 커서 왼쪽에 추가

예시

<<BP<A>>Cd-
|
^ 커서 위치
B P |
    ^
B | P
  ^
B A | P
    ^
B A P |
      ^
B A P C d |
          ^
B A P C |
        ^
결과 : BAPC

👨🏻‍💻 풀이 과정


백준 1406 에디터 문제와 매우 유사한 문제이다.
에디터 문제를 풀 때는 연결 리스트를 이용하여 풀었기 때문에 이번에는 2개의 스택을 이용하여 푸는 방식으로 풀어보겠다.

해당 풀이의 핵심은 커서의 위치를 leftright 두개의 스택 사이에 위치한다고 생각하는 것이다.
그럼 각각의 기능은 다음과 같다

명령설명
<왼쪽에서 pop 후 오른쪽으로 push
>오른쪽에서 pop 후 왼쪽으로 push
-왼쪽에서 pop

전체 풀이

    let fs = require("fs");
    let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
    let Test = parseInt(input.shift());

    const TwoStack = (OrderString) => {
        const OrderArr = OrderString.split('');
        let left = [];
        let right = [];
        for (const Order of OrderArr) {
            if (Order === '<') {
                if (!left.length) continue;
                right.push(left.pop());
            }else if (Order === '>') {
                if (!right.length) continue;
                left.push(right.pop());
            }else if (Order === '-') {
                left.pop();
            }else {
                left.push(Order);
            }
        }
        return left.concat(right.reverse()).join('');
    };

    const solution = (N, INPUT) => {
        let answer = '';
        for (let i = 0; i < N; i++) {
            answer += `${TwoStack(INPUT[i])}\n`;
        }
        return answer;
    };
    console.log(solution(Test, input));

🧐 후기


백준 에디터 문제를 처음 풀고 나서 2개의 스택을 이용하여 푸는 풀이를 봤을 때 어떻게 이런 생각을 하지 하면서 스스로 더 노력해야겠다는 생각을 하게 했던 풀이였는데 그 풀이를 이용하여 풀 수 있는 문제가 나와서 매우 반가우면서도 이번에는 내가 그런 풀이로 풀 수 있다는 것에 기뻤던 문제였다.

profile
JavaScript를 사용하는 모두를 위해...

0개의 댓글