-
문제
https://www.acmicpc.net/problem/1406
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
How to Solve ?
이 문제는 두 개의 스택을 이용해서 해결 할 수 있다.
1) 그렇다면 왜 스택을 사용 하는게 좋을까? && P를 통해 새로운 값을 넣을 때는, 커서의 위치 좌측에 입력된다.
아래의 요구사항에 기재 된 것처럼, 문자를 삭제하거나 추가 할 때는 "커서의 좌측"의 자리에서 발생된다.
커서의 좌측이라고 하면, 어떤 자리에도 들어 갈 수 있는게 아닐까? 라는 생각이 들지만 !
커서가 있는데까지가 글자의 전부 ( = leftStack ) 이라고 가정하면 커서의 좌측은 항상 문자열의 끝에 해당되고, 이는 스택의 push로 해결이 가능하다.
고로
[a, b, c,d ] 라는 최초의 값에서 커서는 d의 뒤쪽에 존재하고, P x라는 커맨드를 주면 [ a, b, c, d, x] 로 입력이 된다.
2) L, D를 통해 커서를 왼쪽 / 오른쪽으로 한 칸 옮김.
이전의 요구사항에서 도출한 방법은 "커서가 존재하는 곳까지가 글자의 전부"라고 가정한다면
커서를 왼쪽 또는 오른쪽으로 옮기는 것은 "보이지 않는 곳" 에 있는 문자열을 가져오거나, "보이는 문자열"을 없애야한다.
그렇다면
leftStack 에는 "커서가 존재하는 곳"까지의 문자열을 rightStack 에는 커서 뒤쪽의 값을 저장할 수 있는데
만약 커서를 좌측으로 옮기게 된다면, 좌측 배열의 가장 오른쪽 값 ( = pop() ) 을 오른쪽 배열에 옮겨주면 커서의 이동이 구현 가능하고,
만약 커서를 우측으로 옮기게 되면, 오른쪽 배열의 pop() 값을 좌측에 넣어 주면 된다
function solution() { const leftStack = s.split(""); const rightStack = []; for (let i = 0; i < commands.length; i++) { const [command, value] = commands[i].split(" "); switch (command) { case "L": if (leftStack.length != 0) { rightStack.push(leftStack.pop()); } break; case "D": if (rightStack.length != 0) { leftStack.push(rightStack.pop()); } break; case "B": if (leftStack.length != 0) { leftStack.pop(); } break; case "P": leftStack.push(value); break; } } let result = leftStack.concat(rightStack.reverse()).join(""); console.log(result); } let s = "abcd"; const commands = ["P x", "L", "P y"]; solution();
'PS > 백준' 카테고리의 다른 글
[백준_1018] 체스판 다시 칠하기 (완전탐색 - 자바스크립트) (0) 2021.06.09 [ 백준 _ 6588 ] 골드바흐의 추측 ( 수학 - 자바스크립트 ) (1) 2021.06.06 [ 백준 _ 2178 ] 미로탐색 ( BFS - 자바스크립트 ) (0) 2021.06.04 [백준 _ 1260] DFS와 BFS ( by using JavaScript ) (0) 2021.06.04 [ 백준 _ 2667 ] 단지번호 붙이기 (DFS) (0) 2021.06.04 댓글