문제 해석
- 두번째 줄 이후의 입력에는 정수 연산자 정수 가 입력된다
- 각 줄마다의 연산을 실행 후 나온 결과를 모두 합해준다
해결 방법
- 주어진 한줄의 입력의 정수와 연산자를 분리해야겠단 생각을 했다
- 각자 가진 연산자가 무엇인지 확인한다
- 그 문자에 따른 연산을 진행해준다
const readline = require('readline');
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
rl.on('line', (line) => {
input.push(line.trim());
if (input.length === Number(input[0]) + 1){
rl.close();
}
/*
첫날에 해맸던 입력부분
input 배열을 만들어서 모두 푸쉬해주고 첫 줄의 입력을 받을 때 보통 테스트 케이스의 갯수를 받는 경우가 많은데
내가 필요한 인풋의 갯수를 파악해서 연산을해 준 후 그 횟수만큼 푸쉬하고
인풋의 길이가 내가 원하는 값이 될 때 rl.close 함수를 호출해준닷
이해됐다
*/
});
rl.on('close', () => {
const nums = []
let result = 0
const T = input.shift()
const data = input.map(el=>el.split(' ').join(''))
for(let i=0; i<data.length; i++){
let cnt = 1
let num1 = ''
let cal = ''
let num2 = ''
//이중 반복문
for(let j=0; j<data[i].length; j++){
//정수와 연산자를 분리해 주는 과정을 거친다
if(cnt === 1 && !isNaN(data[i][j])){
num1 = num1 + data[i][j]
}
if(cnt === 1 && isNaN(data[i][j])){
cal = data[i][j]
cnt++
}
if(cnt === 2 && !isNaN(data[i][j])){
num2 = num2 + data[i][j]
}
}
//연산자에 따른 계산을 해준 후 하나의 배열에 그 결과값을 모두 모아준다
if(cal === '+'){
nums.push((+num1) + (+num2))
}
if(cal === '-'){
nums.push((+num1) - (+num2))
}
if(cal === '/'){
nums.push(Math.floor((+num1) / (+num2)))
}
if(cal === '*'){
nums.push((+num1) * (+num2))
}
}
//계산 !!
for(const num of nums){
result = result + num
}
console.log(result)
})
내가 좋아하는 햄버거를 만드는 문제 !
문제 해석
- 둘째 줄에는 공백을 두고 여러개의 정수가 주어진다
- 첫째 줄에는 그 정수의 갯수가 주어진다
- 둘째 줄의 정수 중 가장 큰 정수를 기준으로 잡는다
- 기준의 좌우로 내림차순이 된다면 정상적인 햄버거라고 볼 수 있다
- 정상적인 햄버거일 시 모든 정수를 더한 후 출력
- 비정상적인 햄버거일 시 0을 출력
문제 풀이
- 가장 큰 수를 먼저 구하기로 하였다
- 좌측에 있는 가장 큰 수를 기준으로 두고 좌 우를 나누어준다
- 그 후에 주어진 조건에 맞는지를 판단한다
- 좌측의 경우는 오름차순인지 우측인 경우는 내림차순인지를 판별한다
- 그렇게 해서 정상적인 햄버거인지 아닌지 알 수 있게 된다
// Run by Node.js
const readline = require('readline');
(async () => {
let rl = readline.createInterface({ input: process.stdin });
//입력 받는 부분의 코드가 다르게 들어왔는데 원리는 비슷했다
let input = []
for await (const line of rl) {
input.push(line.trim())
if(input.length === 2){
rl.close();
}
}
const stuffs = input[1].split(' ').map(el=>+el)
//둘째 줄을 공백을 빼고 배열로 나눠 준 상황
//[1, 2, 3, 3, 1] 이런 형식의 배열이 완성된다
const maxStuff = Math.max(...stuffs)
const arr1 = []
const arr2 = []
//좌 우 각각의 정수들을 담아 줄 배열
let bool1 = true
let bool2 = true
//좌측은 오름차순으로 멀쩡한가
//우측은 오름차순으로 멀쩡한가
//판별을 위한 boolean 변수
let cnt = 0
//좌측이 모두 옮겨지면 카운트 되며 새로운 배열에 우측의 값 들이 담길 수 있도록 만든 변수
for(const stuff of stuffs){
if(cnt == 0){
arr1.push(stuff)
//처음엔 1번배열에 정수들을 담아주고
}
if(cnt === 0 && stuff == maxStuff){
cnt++
continue
//처음 만나는 가장 큰 수
//앞으로는 arr2에 정수가 쌓이도록 스위칭
}
if(cnt == 1){
arr2.push(stuff)
//2번째 배열에 정수가 쌓인다
}
}
/*
arr1 : [1, 2]
arr2 : [3, 1]
*/
for(let i=0; i<arr1.length; i++){
if(arr1[i] > arr1[i+1]){
bool1 = false
break;
}
}
for(let i=0; i<arr2.length; i++){
if(arr2[i] < arr2[i+1]){
bool2 = false
break;
}
}
//오름차순인가 내림차순인가 판별해준다
if(bool1 && bool2){
let sum = 0;
for(let i=0; i<stuffs.length; i++){
sum = sum + stuffs[i]
}
console.log(sum)
}
if(!bool1 || !bool2){
console.log(0)
}
process.exit();
})();
처음엔 입력 가공할 때 문자열로도 풀 수 있겠다는 생각을 했다
그러나 k의 범위가 1 <= k <= 10의6제곱
인 것을 확인한 후에 공백 기준으로 배열을 만들어 주었다
두 문제를 푸는데 약 1시간이 걸렸는데 간단한 문제였음에도 꽤 걸렸다
앞으로도 꾸준히 풀자 !