-
[Node.js/백준/스택] 10828번 스택 / pop, push, 삼항연산, switch문To infinity/Coding Practice 2022. 3. 16. 17:37
2022.03.16 수
Question
How to solve?
이건 풀었다기 보다는 답을 보고 어떤 구조로 알고리즘을 짰는지 분석했다 보는게 맞는 듯 하다.
참, 거짓으로 판명되는 조건을 물어볼때는 삼항연산자(조건문? true : false)나 논리연산자를 쓰면 될 것 같다.
왜냐하면 모든값이 true or false로 반환되니 1 or 0 으로 반환되는 것과 마찬가지니 말이다.
스택은 LILO로 배열이 가로로 있을 땐 가장 오른쪽, 그리고 세로로 있을 땐 가장 위쪽이라고 생각하면 된다.
배열의 가장 마지막에 (배열의 가장 위에) 값을 넣는 array.push와
배열의 가장 마지막 값 (배열의 가장 위의 값)을 빼는 array.pop으로 스택을 구현할 수 있다.
아래는 코드에 대한 설명을 주석으로 달아놓았다.
const input = require('fs').readFileSync('/dev/stdin').toString().split('\n'); //세로로 줄바꿈되어있는 정보를 줄바꿈을 기준으로 문자열로 바꿔 배열로 가져온다. //결과값: input = [14, push 1, push 2, top, size, ...] const len = input.shift(); //array.shift() : 가장 처음에 있는 요소를 배열에서 제거한 후 결과로 반환한다. 큐(Queue)구조를 만들 수 있다. //결과값: 14 const stack = []; // 정수를 저장하는 빈 배열을 만든다. const result = []; // 결과값을 담을 빈 배열을 만든다. for (let i = 0; i < len ; i ++) { switch (input[i]) { //input의 각 인덱스 조건값 중 아래 case에 해당하는 결과를 반한다. 다중조건값에 대한 조건문을 만들 수 있다. case "pop": result.push(stack.pop() || -1); //"스택에서 가장 위에 있는 정수를 빼고": 가장 나중에 들어온 값을 의미하므로 array.pop()을 사용한다. 해당값을 결과로 반환한다. //"그 수를 출력한다.": 해당값을 result 배열에 넣는다. array.push()를 사용하면 가장 위에(마지막에) 요소를 추가한다. //"만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.": 정수가 없다는 의미는 undefined로 출력되고, 논리연산의 경우엔 undefined는 false가 된다. //||(논리합)은 둘중 하나라고 true가 있으면 true를 반환하므로 -1을 반환하게 된다. break; case "size": result.stack.length; //"스택에 들어있는 정수의 개수를 출력한다": 스택의 길이를 구하는 조건을 쓰면 된다. break; case "empty": result.push(stack[0] ? 0 : 1) //"스택이 비어있으면 1, 아니면 0을 출력한다": 비어있단 의미는 첫번째 값이 없단소리다. 즉, 'undefined'이다. //그렇다면 조건문에서 undefined == fasle이기 때문에, 삼항조건문(조건? true:false)에서 false일 때 출력되는 값인 1을 뒤쪽에 배치시키면 된다. break; case "top": result.push(stack[stack.length-1] || -1) //"스택의 가장 위에 있는 정수를 출력한다.": 가장 나중에 들어온 값을 의미한다. 하지만 배열에서 '빼는것'이 아니라 '출력만'하기에 위에서 사용한 'pop'은 쓰면 안된다. //스택의 가장 마지막에 있는 값을 출력하기 위해 인덱스를 사용하자. 마지막 값의 인덱스는 길이에서 1을 뺀 값과 동일하다. //"만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.": 이는 push에서 설명한 것과 동일하다. break; default: //위 모든 조건에 해당하지 않는 경우 result.push(input[i].split(' ')[1]); //'push'의 경우엔 입력이 'push 1' 이렇게 띄어쓰기로 구분된 두가지 값으로 구성되어 있다. 따라서, 띄어쓰기를 기준으로 배열로 바꿔서, 배열의 두번재 인덱스를 값으로 가져온다. break; } } console.log(result.join('\n')) //각 결과값이 한줄씩 엔터된 상태로 반환되어야 함으로 array.join을 이용하여 입력받은 구분자로 연결한 문자열을 빈환시킨다.
Reference
'To infinity > Coding Practice' 카테고리의 다른 글
[Node.js/백준/구현] 2562번 최대값 / Math.max & findIndex (0) 2022.03.14 [Node.js/백준/구현] 2438번 별찍기 -1 / for 반복문 (0) 2022.03.14 [Programmers/Javascript] 위장 (Hash) (0) 2021.07.05 [Programmers/Javascript] 완주하지 못한 선수 (0) 2021.07.05 [백준 Node.js/Javascript] 2839번 설탕 배달 (0) 2021.07.03