
์ ์ฌ์๊ฐ์ ๋๋์ด ๋ค์ด, ์ผ๋ถ ํ์์ด ์ฒด์ก๋ณต์ ๋๋๋นํ์ต๋๋ค. ๋คํํ ์ฌ๋ฒ ์ฒด์ก๋ณต์ด ์๋ ํ์์ด ์ด๋ค์๊ฒ ์ฒด์ก๋ณต์ ๋น๋ ค์ฃผ๋ ค ํฉ๋๋ค. ํ์๋ค์ ๋ฒํธ๋ ์ฒด๊ฒฉ ์์ผ๋ก ๋งค๊ฒจ์ ธ ์์ด, ๋ฐ๋ก ์๋ฒํธ์ ํ์์ด๋ ๋ฐ๋ก ๋ท๋ฒํธ์ ํ์์๊ฒ๋ง ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, 4๋ฒ ํ์์ 3๋ฒ ํ์์ด๋ 5๋ฒ ํ์์๊ฒ๋ง ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค. ์ฒด์ก๋ณต์ด ์์ผ๋ฉด ์์ ์ ๋ค์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฒด์ก๋ณต์ ์ ์ ํ ๋น๋ ค ์ต๋ํ ๋ง์ ํ์์ด ์ฒด์ก์์ ์ ๋ค์ด์ผ ํฉ๋๋ค.
์ ์ฒด ํ์์ ์ n, ์ฒด์ก๋ณต์ ๋๋๋นํ ํ์๋ค์ ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฐฐ์ด lost, ์ฌ๋ฒ์ ์ฒด์ก๋ณต์ ๊ฐ์ ธ์จ ํ์๋ค์ ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฐฐ์ด reserve๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ฒด์ก์์ ์ ๋ค์ ์ ์๋ ํ์์ ์ต๋๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
| n | lost | reserve | return |
|---|---|---|---|
| 5 | [2, 4] | [1, 3, 5] | 5 |
| 5 | [2, 4] | [3] | 4 |
| 3 | [3] | [1] | 2 |
lost ์ reserve ์ ๋ ๋ค ์๋ ๊ฒฝ์ฐ, ์ฆ ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ ธ์จ ํ์์ด ๋๋์ ๋นํ๋ ๊ฒฝ์ฐ์๋ ๋ณธ์ธ์ด ์
์ด์ผ ํ๋ฏ๋ก ์ฒด์ก๋ณต์ ๋น๋ ค์ค ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ๊ฐ ๋ฐฐ์ด์์ ํด๋น ํ์์ ์ ์ธํด์ฃผ์ด์ผ ํฉ๋๋ค.
const both = lost.filter(student => reserve.includes(student));
const realLost = lost.filter(student => !both.includes(student));
const realReserve = reserve.filter(student => !both.includes(student));
๊ทธ๋ฆฌ๊ณ ๋ฒํธ ์์๋๋ก ์ ์ฌ๋์๊ฒ ๋น๋ ค์ค๋๋ค. ๋ค์ ์๋ ํ์์ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋น๋ฆด ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๊ฒ ํ์์ ์ ํ์ ๋๋ค. ๋์์ค ์ ์๋ ์ฌ๋์ ์ต๋ํ ๋์์ฃผ๋, ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ฌ๋๋ถํฐ ๋์์ฃผ๋ ์ ๋ต์ ๋๋ค.
let count = realLost.length;
for(let i = 0; i < realLost.length; i++){
let idx = realReserve.indexOf(realLost[i] - 1);
if(idx > -1){
realReserve.splice(idx, 1)
count --;
} else {
idx = realReserve.indexOf(realLost[i] + 1);
if(idx > -1){
realReserve.splice(idx, 1)
count--;
} else {
continue;
}
}
}
return n - count;
์์ฌ ์ฝ๋ ๋๋ก ์์ฑํ ์ฝ๋์
๋๋ค. ํต๊ณผ๋ ํ์ง๋ง ๋งค๋ฒ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๊ณ splice()๋ฅผ ํ๋ ๋ก์ง์ด ๊ต์ฅํ ๋นํจ์จ์ ์ผ๋ก ๋ณด์
๋๋ค. ์ธ๋ฑ์ค ์ฐพ๊ธฐ(O(n)) x splice๋ก ์ฌ๋ฐฐ์น(O(n))๋ฅผ ํ๋ฏ๋ก ์ต์
์ ๊ฒฝ์ฐ O(nยฒ)์ด ๊ฑธ๋ฆฝ๋๋ค.
์ด๋ด ๋ ํด์ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค. ํด์ํ ์ด๋ธ์ ํ์๊ณผ ์ญ์ ๊ฐ O(1)๋ก ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐ์ realReserve๋ฅผ Set์ผ๋ก ๋ง๋ค์ด ์ค๋๋ค.
const realReserve = new Set(reserve.filter(student => !both.includes(student)));
์ด๋ฅผ ์ด์ฉํด์ ํ์ํ๊ณ ์ญ์ ํด ์ค๋๋ค.
for(let student of realLost) {
if(realReserve.has(student - 1){
realReserve.delete(student - 1);
count--;
} else if (realReserve.has(student + 1){
realReserve.delete(student + 1);
count--;
}
}
function solution(n, lost, reserve) {
const both = lost.filter(student => reserve.includes(student));
const realLost = lost.filter(student => !both.includes(student)).sort((a, b) => a - b);
const realReserve = new Set(reserve.filter(student => !both.includes(student)));
let count = realLost.length;
for(let student of realLost) {
if(realReserve.has(student - 1)) {
realReserve.delete(student - 1);
count--;
} else if (realReserve.has(student + 1)){
realReserve.delete(student + 1);
count--;
}
}
return n - count;
}
Map์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๊ฐ๋ณต์ก๋, ๊ณต๊ฐ๋ณต์ก๋, ๊ฐ๋ ์ฑ, ํ์ฅ์ฑ๊น์ง ๊ณ ๋ คํ ์ต์ ์ ์ค๊ณ์ ๋๋ค.
ํ์ ๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋ง๋ค๊ณ , ๊ฐ ์ธ๋ฑ์ค๋ฅผ -1(์์ด๋ฒ๋ฆผ), 1(์ฌ๋ฒ ์์), 0(๋ฌด๊ดํ์ํ)๋ก ๊ด๋ฆฌํ์ฌ ํ๋์ ๋ฐฐ์ด ์ํ๋ก ๋ชจ๋ ๋ก์ง์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค
function solution(n, lost, reserve) {
// ํ์๋ค ๋ฒํธ๊ฐ ๊ณง ์ธ๋ฑ์ค๊ฐ ๋๋๋ก ๋ฐฐ์ด์ ๋ง๋ค์ด ์ค๋๋ค.
// ์ด ๋, 1๋ฒ ๋ถํฐ ์ฌ์ฉํ๊ธฐ ์ํด 0๋ฒ์ ์ถ๊ฐํ๋๋ก +1,
// ์ถํ ๋ฐ๋ณต๋ฌธ์์ ๋ท ๋ฒํธ ํ์์ ๊ฒ์ํ ๋ undefined๊ฐ ๋์ค์ง ์๋๋ก +1 ํ์ฌ n + 2๋งํผ ๋ง๋ญ๋๋ค.
const student = new Array(n + 2).fill(0);
// ์ฌ๋ฒ ์ฒด์ก๋ณต์ ๊ฐ์ง ํ์๋ค์ ํ์ํด ์ค๋๋ค.
for (let r of reserve) {
student[r]++; // 1
}
// ๋๋ ๋นํ ํ์๋ค์ ํ์ํด ์ค๋๋ค.
for (let l of lost) {
student[l]--; // -1
}
for (let i = 1; i <= n; i++) {
if (student[i] === -1) {
// ๋๋ ๋นํ ํ์์ด๋ผ๋ฉด
if (student[i - 1] === 1) {
// ์๋ฒํธ ํ์์ด ์ฌ๋ฒ์ด ์๋ค๋ฉด ๋น๋ ค์ฃผ๊ณ -1
// ๋น๋ฆฐ ํ์์ +1ํด์ ๋ฌด๊ดํ ์ํ๋ก ๋ฐ๊ฟ์ค๋๋ค.
student[i]++;
student[i - 1]--;
} else if (student[i + 1] === 1) {
// ๋ง์ฝ ์๋ฒํธ ํ์์ด ์ฌ๋ฒ์ด ์๊ณ , ๋ท ๋ฒํธ ํ์์ด ์ฌ๋ฒ์ด ์๋ค๋ฉด
// ๋๊ฐ์ด ๋น๋ ค์ฃผ๊ณ -1, +1 ํด์ค๋ค.
student[i]++;
student[i + 1]--;
}
}
}
// ์ต์ข
์ ์ผ๋ก ๊ฐ์ด 0์ธ ํ์๋ค๋ง ์ธ์ด์ค๋ค.
return student.slice(1, n + 1).filter(x => x >= 0).length;
}
๋น๊ตํด๋ณด๋ฉด ํ
์คํธ 1์ ๊ธฐ์ค์ผ๋ก 20ms ์์ 0.08ms๋ก ํฌ๊ฒ ์ค์ด๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค.
