Question
๋ฐฑ์ค 2108๋ฒ : ํต๊ณํ
์๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ํต๊ณํ์์ ์๋นํ ์ค์ํ ์ผ์ด๋ค. ํต๊ณํ์์ N๊ฐ์ ์๋ฅผ ๋ํํ๋ ๊ธฐ๋ณธ ํต๊ณ ๊ฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค. ๋จ, N์ ํ์๋ผ๊ณ ๊ฐ์ ํ์.
- ์ฐ์ ํ๊ท : N๊ฐ์ ์๋ค์ ํฉ์ N์ผ๋ก ๋๋ ๊ฐ
- ์ค์๊ฐ : N๊ฐ์ ์๋ค์ ์ฆ๊ฐํ๋ ์์๋ก ๋์ดํ์ ๊ฒฝ์ฐ ๊ทธ ์ค์์ ์์นํ๋ ๊ฐ
- ์ต๋น๊ฐ : N๊ฐ์ ์๋ค ์ค ๊ฐ์ฅ ๋ง์ด ๋ํ๋๋ ๊ฐ
- ๋ฒ์ : N๊ฐ์ ์๋ค ์ค ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ฐจ์ด
N๊ฐ์ ์๊ฐ ์ฃผ์ด์ก์ ๋, ๋ค ๊ฐ์ง ๊ธฐ๋ณธ ํต๊ณ๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ ๊ฐ์ N(1 ≤ N ≤ 500,000)์ด ์ฃผ์ด์ง๋ค. ๋จ, N์ ํ์์ด๋ค. ๊ทธ๋ค์ N๊ฐ์ ์ค์๋ ์ ์๋ค์ด ์ฃผ์ด์ง๋ค. ์ ๋ ฅ๋๋ ์ ์์ ์ ๋๊ฐ์ 4,000์ ๋์ง ์๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์๋ ์ฐ์ ํ๊ท ์ ์ถ๋ ฅํ๋ค. ์์์ ์ดํ ์ฒซ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผํ ๊ฐ์ ์ถ๋ ฅํ๋ค.
๋์งธ ์ค์๋ ์ค์๊ฐ์ ์ถ๋ ฅํ๋ค.
์ ์งธ ์ค์๋ ์ต๋น๊ฐ์ ์ถ๋ ฅํ๋ค. ์ฌ๋ฌ ๊ฐ ์์ ๋์๋ ์ต๋น๊ฐ ์ค ๋ ๋ฒ์งธ๋ก ์์ ๊ฐ์ ์ถ๋ ฅํ๋ค.
๋ท์งธ ์ค์๋ ๋ฒ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ์์
5
1
3
8
-2
2
์ถ๋ ฅ์์
2
2
1
10
My code
์ฒ์์ -0์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฑฐ ๋๋ฌธ์ ํ๋ ธ๋ค.
let input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n');
let arr = input.map(Number);
let length = arr[0];
arr.shift();
// ์ฐ์ ํ๊ท -๋ฐ์ฌ๋ฆผ
let a = arr.reduce((a, b) => a + b);
let avg = Math.round(a / length);
// ์ค์๊ฐ -๋ฒ๋ฆผ
arr.sort((a, b) => a - b);
let answer = (length % 2 === 0 ? arr[length / 2] + arr[(length / 2) - 1] : arr[Math.floor(length / 2)])
// ์ต๋น๊ฐ ๋ฐ์ดํฐ ์งํฉ์์ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ๋ ๊ฐ, ์ฌ๋ฌ๊ฐ ์์๋ ๋๋ฒ์งธ๋ก ์์๊ฐ ์ถ๋ ฅ
function getMostValue() {
const map = new Map();
for (let i in arr) {
if (!map.has(arr[i])) {
map.set(arr[i], 1) // key, value ์ ์ฅ
} else {
map.set(arr[i], map.get(arr[i]) + 1) // value + 1 ์ค๋ณต๋๋ฉด ๋น๋์ ์ถ๊ฐ, get์ value๋ถ๋ฌ์ด ์ํ
}
}
let maxValue = 0;
let arr2 = [];
map.forEach((ele, key) => {
if (maxValue < ele) {
maxValue = ele;
arr2 = []; // ๋ฐฐ์ด ๋ฆฌ์
arr2.push(key); // ๋ฐ๋์๊ฐ ํฐ ๊ฒ๋ง ๋ฐฐ์ด์ ์ถ๊ฐ
} else if (maxValue === map.get(key)) {
arr2.push(key); // ๋น๋์๊ฐ ๋๊ฐ๋ค๋ฉด ์ ๋ถ ๋ฐฐ์ด์ ์ถ๊ฐํ๊ธฐ
}
})
return arr2.length !== 1 ? arr2[1] : arr2[0];
}
// ๋ฒ์ ์ต๋๊ฐ - ์ต์๊ฐ
let max = Math.max(...arr);
let min = Math.min(...arr);
let range = max - min;
console.log(avg);
console.log(answer);
console.log(getMostValue());
console.log(range);
ํ๋ ธ์ต๋๋ค
WHY?
์์์ ๋ณด๋ฉด -0.333333... ์ ๋ฐ์ฌ๋ฆผํด์ 0์ ์ถ๋ ฅํด์ผ ํ๋ ๊ฒ ์์๋ค. ํ์ง๋ง ์ถ๋ ฅํด๋ณด๋ฉด -0์ด ๋์จ๋ค!
-0์ด๋ 0์ ๊ฐ์ ๊ฒ ์๋๊น? 0์ผ๋ก ์ถ๋ ฅํ๋ผ๊ณ ํ๋๋ฐ ๊ถ๊ธํด์ก๋ค.
๊ทธ๋ฆฌ๊ณ ์ญ์ ๋ ๊ฐ์ ์ฌ๋์ ๋ฐ๊ฒฌํ๋ค.
According to the IEEE 754 standard, negative zero and positive zero should compare as equal with the usual (numerical) comparison operators
์์์ ์ฐ์ฐ ํ์ค์ธ IEEE754์ ์ํ๋ฉด 0์ -0๊ณผ +0์ผ๋ก ํํํ ์ ์๋ค.
๋ฐ๋ผ์ -0์ผ๋ก ์ถ๋ ฅํด๋ ์ฌ์ค์ ๋ง๋ ๊ฐ์ด๋ 0์ผ๋ก ์ถ๋ ฅ๋ ์ ์๋๋ก ์์ ์ค๋ช ์ ์ถ๊ฐํ๋ค๊ณ ํ๋ค.
map์ ์ฒ์ ์ฌ์ฉํด๋ด์ ์ฌ๊ธฐ์ ํ๋ฆฐ ์ค ์์๋๋ฐ ์๋์๋ค.
-0์ด 0์ผ๋ก ์ถ๋ ฅ๋ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ ํด ์ ์ถํ๋ค.
let input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n');
let arr = input.map(Number);
let length = arr.shift();
// ์ฐ์ ํ๊ท
let a = arr.reduce((a, b) => a + b, 0);
let avg = Math.round(a / length);
// ์ค์๊ฐ
arr.sort((a, b) => a - b);
let answer = (length % 2 === 0 ? arr[length / 2] + arr[(length / 2) - 1] : arr[Math.floor(length / 2)])
// ์ต๋น๊ฐ ๋ฐ์ดํฐ ์งํฉ์์ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ๋ ๊ฐ, ์ฌ๋ฌ๊ฐ ์์๋ ๋๋ฒ์งธ๋ก ์์๊ฐ ์ถ๋ ฅ
function getMostValue() {
const map = new Map();
for (let i in arr) {
if (!map.has(arr[i])) {
map.set(arr[i], 1) // key, value ์ ์ฅ
} else {
map.set(arr[i], map.get(arr[i]) + 1) // value + 1 ์ค๋ณต๋๋ฉด ๋น๋์ ์ถ๊ฐ, get์ value๋ถ๋ฌ์ด ์ํ
}
}
let maxValue = 0;
let arr2 = [];
map.forEach((ele, key) => {
if (maxValue < ele) {
maxValue = ele;
arr2 = []; // ๋ฐฐ์ด ๋ฆฌ์
arr2.push(key); // ๋ฐ๋์๊ฐ ํฐ ๊ฒ๋ง ๋ฐฐ์ด์ ์ถ๊ฐ
} else if (maxValue === map.get(key)) {
arr2.push(key); // ๋น๋์๊ฐ ๋๊ฐ๋ค๋ฉด ์ ๋ถ ๋ฐฐ์ด์ ์ถ๊ฐํ๊ธฐ
}
})
return arr2.length !== 1 ? arr2[1] : arr2[0]; // ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 1์ด ์๋๋ผ๋ฉด ๋๋ฒ์งธ๋ก ์์ ์ต๋น๊ฐ ์ถ๋ ฅ
}
// ๋ฒ์
let max = Math.max(...arr);
let min = Math.min(...arr);
let range = max - min;
console.log(avg === -0? 0 : avg);
console.log(answer);
console.log(getMostValue());
console.log(range);
๋ง์์ต๋๋ค!!
HOW? (ํ์ด๋ฐฉ๋ฒ)
์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ํธ๋ ๋ฌธ์ ๋ ์๋์๊ณ ํต๊ณํ ๊ณ์ฐ์์ ๊ทธ๋๋ก ์ฝ๋๋ก ์ ์ด๋ด๋ฉด ๋๋ค.
1. ์ฐ์ ํ๊ท : reduce๋ฅผ ์ด์ฉํด ์ ๋ ฅ๋ ์๋ค์ ํฉ์ ๊ตฌํ๊ณ shift๋ก ๋นผ๋ด ์จ ์์ ๊ฐ์๋ก ๋๋์๋ค.
2. ์ค์๊ฐ : ์ ๋ ฅ๋ ์์ ๊ฐ์๊ฐ ์ง์์ผ ๊ฒฝ์ฐ ์ค์๊ฐ์ ๊ฐ์ด๋ฐ์ ์๋ ๋ ๊ฐ์ ์ซ์ ํ๊ท ์ด์๋ค.
์ง์ ์ฌ๋ถ์ ์กฐ๊ฑด๋ฌธ์ ๊ฑธ๊ณ ๊ฐ๊ฐ ์ค์๊ฐ์ด ๋์ฌ ์ ์๋๋ก ์ค์ ํ๋ค.
3. ์ต๋น๊ฐ : map์ ์ด์ฉํด์ ๋น๋์๊ฐ ์ต๋์ธ ๊ฒ์ ์๋ก์ด ๋ฐฐ์ด์ ์ ์ฅํด return ํ๋ค.
๊ตฌ์ฒด์ ์ธ ์ค๋ช ์ ์์ ์ฝ๋์ ์ ์ด๋จ๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ค๋ช ์ ๋ณด๋ฉด ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค.
4. ๋ฒ์ : ๋ฐฐ์ด์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ Math.max ์ Math.min์ผ๋ก ๊ตฌํด ๊ณ์ฐํ๋ค.
์ต๋น๊ฐ์ ๊ตฌ๊ธ๋ง์ ํตํด ํด๊ฒฐํ๋ค. ๋ค์์๋ ์ ๋ณด๊ณ ํ ์ ์๊ฒ ํด์ผ์ง ๋ค์งํด๋ณธ๋คโ
์ต๋น๊ฐ์ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ๋ ์ ๋ง ์ด๋ ค์ ๋ค. map์ ์ฒ์ ์ฌ์ฉํด๋ด์ ๋ ๊ทธ๋ฌ๋ค.
๋ฐ๋ด ๊ตฌ๊ธ๋ง์ ๊ณ ๋ง๋ค.
'Algorithms > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] ๋ฐฑ์ค 10870๋ฒ : ํผ๋ณด๋์น ์ 5 (0) | 2022.05.16 |
---|---|
[JS] ๋ฐฑ์ค 10872๋ฒ : ์ฌ๊ท (0) | 2022.05.15 |
[JS] ๋ฐฑ์ค 2750๋ฒ : ์ ์ ๋ ฌํ๊ธฐ (0) | 2022.05.09 |
[JS] ๋ฐฑ์ค 2292๋ฒ : ๋ฒ์ง (0) | 2022.05.06 |
[JS] ๋ฐฑ์ค 1712๋ฒ : ์์ต๋ถ๊ธฐ์ (0) | 2022.05.05 |