✨ 배열(array)을 원하는 크기 만큼 자르고 싶을 때 사용하는 helper method(원래 값은 유지되며, copy개념이다) (e.g., arr.slice(0,2)) 왼쪽처럼 시작(0), 끝(2) index를 지정해주면, array의 0부터 1 index까지 값을 얻어낼 수 있다. slice( '시작', '여기 바로 앞까지' )으로 기억해주면 편하다. Capitalize, Chunk and Merge Sort Algorithm 에서 유용하게 사용하였다.
💻Example Code
const arr = [ 1, 2, 3, 4, 5 ];
console.log( arr.slice(0,2) );
😋 자주 사용하지 않다가 사용하면, 어디까지 array가 잘리는지 헷갈리기 쉬운 helper method이다.
😢 역시 쉬운 문제라 내 방식대로 금방 풀었지만, 백준 형식에 맞지 않는 것인지 계속 '틀렸습니다'가 출력되었다. 이렇게 저렇게 한 10번은 바꿔보았지만, 틀린 이유를 찾지 못했다. 생각날 때마다 시도해봐야겠다. (위의 코드는 정답 코드)
😊 이번 문제에서 Function.prototype.apply()와 Number.prototype.toFixed()를 학습할 수 있었다.
✔ Function.prototype.apply() 관련 최대값을 구하기 위해서 주로 3가지 방법을 사용했었다. 1. 적은 수의 값들에서 Max를 구할 때는 'Math.max(values...) 2. classic for loop을 이용하여 하나씩 비교하여 최종 Max값을 구하는 방법 3. 백준에서는 적용되지 않지만, Math.max(...values)처럼 ES2015 'Spread'사용하여 구하는 방법
하지만, 위의 13번째 code인 Math.max.apply(null, grades) 를 이용하면 보다 쉽게 max를 구할 수 있다. 간단히 설명하자면, 두 번째 arguments에 array(or an array-like object)를 넣어주면 된다.
✔ Number.prototype.toFixed() 위의 helper method를 이용해 소수점 아래의 수를 표시할 수 있다. (e.g., toFixed(2)는 소수점 아래 2번째까지 출력)
😢 쉬운 문제였기 때문에 금방 풀었으나, 문제는 뜻밖의 부분에 있었다. 값을 읽어올 때, trim()을 적용시켜주지 않아서, 마지막 공백 ''이 들어왔기 때문이다. 그래서 ''%42=0이 되어버렸고, theRestMap Object key값 0의 값이 1만큼 올라갔다. 따라서, 결과값이 항상 1만큼 더 높게 나와 '틀렸습니다' 결과를 받았다.
😊 Object를 하나 선언해주고, for of loop을 이용해 해당 나머지값(key)이 중복될 때마다 값(value)를 1씩 증가해준다. 그런 후 마지막에 Object.keys(theRestMap).length 를 출력하여 key의 개수(길이)만큼 출력하면 그것이 나머지의 개수다.
😢 가장 기초적인 classic for loop을 이용해 문제를 풀었더니 시간이 조금 길어졌고, 다른 풀이도 참고해보고 싶었다.
😊 reduce helper를 이용해 조금 더 압축적인 코드를 작성할 수 있다.
✔ reduce의 첫 번째 parameter인 acc(위에서는 minMax)에 주어진 최대(1000000)와 최소(-1000000)범위를 배열로 초기 선언 해주고, 두 번째 parameter인 value(위에서는 num)를 통해 입력 받은 숫자를 하나씩 비교하여 최종 값을 받아낼 수 있다.
✔ 즉, 입력 받은 숫자가 최대보다 작으면 minMax[0]에 저장하며 반복 비교(minMax[1]도 마찬가지)
Full Code
// 3rd Solution (reduce, minMax)
const fs = require('fs');
const input = fs
.readFileSync('/dev/stdin')
.toString()
.split('\n');
const N = parseInt(input[0]);
const resultMinMax = input[1].split(' ').reduce(
(minMax, num) => {
const number = parseInt(num);
minMax[0] = minMax[0] > number ? number : minMax[0];
minMax[1] = minMax[1] < number ? number : minMax[1];
return minMax;
},
[1000000, -1000000]
);
console.log(resultMinMax.join(' '));
// 2nd Solution (classic for loop)
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().split('\n');
// const N = parseInt(input[0]);
// const numArr = input[1].split(' ').map(num => {
// num = parseInt(num);
// return num;
// });
// let max = numArr[0];
// let min = numArr[0];
// for (let i = 0; i < numArr.length; i++) {
// if (numArr[i] > max) {
// max = numArr[i];
// }
// if (numArr[i] < min) {
// min = numArr[i];
// }
// }
// console.log(min + ' ' + max);
// 1st Solution(Spread in VSC)
// const input = ['5', '20 10 35 30 7'];
// const N = parseInt(input[0]);
// const numArr = input[1].split(' ').map(num => {
// num = parseInt(num);
// return num;
// });
// const max = Math.max(...numArr);
// const min = Math.min(...numArr);
// console.log(numArr);
// console.log(min + ' ' + max);
1️⃣초기값(===새로운 수)2️⃣ 각 자릿수 더하기 3️⃣ 새로운 수 26 👉 2+6=08 👉 68 68 👉 6+8=14 👉 84 84 👉 8+4=12 👉42 42 👉 4+2=06 👉26 2️⃣식에서 각 자릿수를 더할 때 '1의 자릿수'를 '10의 자릿수'로 만들어 주기 위해 '✔10의 자릿수'식 사용 2️⃣식에서 각 자릿수를 더한 결과값의 '1의 자릿수'를 구하기 위해 '✔ 1의 자릿수'식 사용 위의 두 값을 합하면 '새로운 수'를 구할 수 있다. (반복)