-
문제
정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여섯 가지이다.
- 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