백준 알고리즘 기초

0

알고리즘

목록 보기
8/8

자료구조

10828 - 스택

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
push X: 정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 스택에 들어있는 정수의 개수를 출력한다.
empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

// 내 코드 

let input = require('fs').readFileSync('dev/stdin').toString().split('\n');

const stack = []
for (let i=1; , i <= input[0]; i++){
    const x= input[i].split(' ');
    if (x.length >1 ){
        stack.push(x[1])
    }else {
        switch (input[i]){
            case 'pop':
                stack.length=0 ? console.log(-1): console.log(stack.pop())
            case 'top':
                stack.length=0 ? console.log(-1): console.log(stack[stack.length-1])
            case 'size':
                console.log(stack)
            case 'empty':
                stack.length=0 ? console.log(1): console.log(0)
                
        }
    }
}

위에 처럼 작성을 했지만 통과하지 않음

const array = require('fs').readFileSync('/dev/stdin').toString().split('\n');

const stack = [];
const result = [];

const len = array.shift();

for (let i = 0; i < len; i++) {        
    switch(array[i]) {
        case 'pop': 
          result.push(stack.pop() || -1);
          break;

        case 'size': 
          result.push(stack.length);
          break;

        case 'empty': 
          result.push(stack[0] ? 0 : 1);
          break;

        case 'top': 
          result.push(stack[stack.length - 1] || -1);
          break;

        default: 
          stack.push(array[i].split(" ")[1]);
          break;
    }
}

console.log(result.join('\n'));

출처 : https://gurtn.tistory.com/67

우선 array.shift로 스택에서 제일 아래 자료를 가져와서 for loop range를 설정해준다.

그리고 switch 문을 적용을 해주는데 핵심은 세가지다

  1. push 메서드를 디폴트 값으로 넣어주어서 다시 if문을 사용할 필요 없이 작성
  2. result.push(stack.pop() || -1)로 stack.pop()이 가능하지 않을 때(Falsy) -1을 결과에 추가하는 방식이다.
    중간에 empty에서 ternary도 적용해주었다.
  3. 시간초과 이슈로 result 한 배열에 답을 넣어주고 한번에 출력을 해준다.

9093 - 단어 뒤집기


// 내 답변
const input = require('fs').readFileSync('/dev/stdin').toString().split('\n');

const len = input[0];
const answer = []


for (let i = 1; i <= len ; i++){
  const text = input[i].split(' ') 
  let reverse = text.map((word)=>{
    let x = word.split('')
    x.reverse()
    return x.join('')
  })
  const result = reverse.join(' ')
  answer.push(result)
	
}


console.log(answer.join('\n'))

배열을 다시 합칠 때는 arr.join()이 활용도가 높다.
js 배열 뒤집는 메서드는 arr.reverse()
원본 유지하며 배열을 뒤집고자 할 때는 const reverseArr = [...arr].reverse() 구조분해할당 이용

9012 - VPS (괄호 짝맞추기)

// 내 답변 

const input = require('fs').readFileSync('/dev/stdin').toString().split('\n');

const range = input[0]
const answer = []


for (let i = 1; i <= range ; i++){
  let left = 0
  let right =0 
  const text = input[i].split('') 
  for (let x of text){
    if (x === `(`){
      left += 1
    }else {
      right +=1
    }
  }
  let result = ''
  left === right ? result ='YES': result='NO'
  answer.push(result)
	
}


console.log(answer.join('\n'))

잘 짠 것 같은데 틀렸다고 나온다.... 자세히 보니 만약 입력을 ())(()을 입력하면 내 코드로는 맞다고 나오지만 예제출력에서는 NO로 나왔다.
VPS의 정의를 제대로 이해하지 않고 시작해서 발생한 문제이다.

//참고 답변
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

const len = input.shift();
const result = [];

for (let i = 0; i < len; i++) {
    let cnt = 0;
    
    for (let s of input[i]) {
        cnt += s === "(" ? 1 : -1;
        
        if (cnt < 0) break;
    }
    
    result.push(cnt === 0 ? 'YES' : "NO");
}

console.log(result.join('\n'));

참고 : https://gurtn.tistory.com/68

괄호가 열린다음 닫혀야 하는데 열리지 않고 닫힌 순간cnt음수가 되어서 해당 문자열은 VPS가 아니게 된다.

profile
기록을 통해 한 걸음씩 성장ing!

0개의 댓글