ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10845. 큐
    Baekjoon 2023. 5. 2. 02:26

     문제 

    정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

    명령은 총 여섯 가지이다.

    • push X: 정수 X를 큐에 넣는 연산이다.
    • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    • size: 큐에 들어있는 정수의 개수를 출력한다.
    • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
    • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

     

     입력 

    첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

    15
    push 1
    push 2
    front
    back
    size
    empty
    pop
    pop
    pop
    size
    empty
    pop
    push 3
    empty
    front
    

     

     출력 

    출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

    1
    2
    2
    0
    1
    2
    -1
    0
    1
    -1
    0
    3

     

     

     에러 

    더보기

    사실 이 문제에서는 에러가 한번도 발생하지 않았다.

    다만 코드 길이를 줄이고 가독성을 높이는데에 있어서 조금 노력해봤다.

    저번 스터디때 어떤분의 코드를 보고 굉장히 뭐랄까 부러웠기 때문... (나도 저래야하는데...)

    const fs = require("fs");
    const readFileSyncAdd = "10845.txt";
    const input = fs.readFileSync(readFileSyncAdd).toString().split('\n');
    
    const stack = [];
    let res = '';
    
    const len = input.shift();
    
    for (let i = 0; i < len; i++) {   
        const cmd = input[i].split(' ')[0].trim();   
        let ans = '';  
    
        switch(cmd) {
    
            case 'push': 
                const pushItem = input[i].split(' ')[1]
                stack.splice(stack.length, 0, pushItem);
                break;
    
            case 'pop': 
                if (stack.length == 0) 
                {
                    ans = -1;  
                }
                else 
                { 
                    ans = stack.splice(0, 1); 
                }
                res += ans + ' ';
                break;
    
            case 'size': 
                ans = stack.length; 
                res += ans + ' ';  
                break;
    
            case 'empty': 
                if (stack.length == 0)
                {
                    ans = 1;
                }
                else 
                {
                    ans = '0';
                }
                res += ans + ' ';
                break;
    
            case 'front': 
                if (stack.length == 0) 
                {
                    ans = -1;
                }
                else {
                    ans = stack.slice(0, 1).join(' ');
                }
                res += ans + ' ';
                break; 
    
            case 'back': 
                if (stack.length == 0) 
                {
                    ans = -1;
                }
                else {
                    ans = stack.slice(-1).join(' ');
                }
                res += ans + ' ';
                break; 
    
    
        }
    } 
    console.log(res.split(' ').join('\n'));

    일단 이게 수정 전 코드다. 쓸데없이 길고 쓸데없이 긴덕에 가독성도 굉장히 떨어진다.

    분명 에러 없이 멀쩡하게 잘 작동되긴 한다. 제출하면 정답이라고도 한다. 

    하지만 굉장히 마음에 안든다. 그래서 수정했다.

    if else 문은 삼항연산자로 바꾸었고 출력값을 넣는 ans와 res는 ans 하나로 사용했다.

    (왜 굳이 ans와 res로 나누었는지 나도 잘 모르겠다...)

    그리고 내장메서드인 push()나 pop()을 사용하면 굉장히 편리한데,

    어디서 splice()가 활용도가 좋다는 얘기를 듣고 한번 써봤다.

    확실히 값을 빼는데도 splice를 사용할 수 있고 추가하는데도 splice를 사용할 수 있어서 이거 하나로 만사해결되긴 하는듯? (다만 가독성이 좀 떨어지고 코드가 길어지긴 한다.)

     

    그래서 최종 코드는 아래와 같다.

     

     코드 

    const fs = require("fs");
    const readFileSyncAdd = "10845.txt";
    const input = fs.readFileSync(readFileSyncAdd).toString().split('\n');
    const len = input.shift();
    
    const stack = [];
    const ans = [];
    
    for (let i = 0; i < len; i++) {   
        const cmd = input[i].split(' ')[0].trim(); 
        switch(cmd) {
            case 'push': 
                const pushItem = input[i].split(' ')[1]
                stack.splice(stack.length, 0, pushItem);
                break;
    
            case 'pop': 
                stack.length == 0 ? ans.splice(ans.length,0, -1) : ans.splice(ans.length, 0, stack.splice(0, 1).join(''))
                break;
    
            case 'size': 
                ans.splice(ans.length, 0, stack.length);
                break;
    
            case 'empty': 
                stack.length == 0 ? ans.splice(ans.length, 0, 1) : ans.splice(ans.length, 0, 0)
                break;
    
            case 'front':
                stack.length == 0 ? ans.splice(ans.length, 0, -1) : ans.splice(ans.length, 0 , stack.slice(0, 1).join(''))
                break; 
    
            case 'back': 
                stack.length == 0 ? ans.splice(ans.length, 0, -1) : ans.splice(ans.length, 0 , stack.slice(-1).join(''))
                break; 
        }
    } 
    console.log(ans.join('\n'));

    'Baekjoon' 카테고리의 다른 글

    1935. 후위 표기식2  (0) 2023.05.07
    11655. ROT13  (0) 2023.05.02
    10820. 문자열 분석  (0) 2023.05.02
    1157. 단어 공부  (0) 2023.04.09
    9093. 단어 뒤집기  (0) 2023.04.09
Designed by Tistory.