[Algorithm] ์๋ฐ์คํฌ๋ฆฝํธ ์(pairs)์ ํฌํจํ๋ ๋ฐฐ์ด์์ ์ ๋ํฌ ๋๋ฒ ์ฐพ๊ธฐ
์๋ ๋ฐฐ์ด์์ ๋จ ํ๋ฒ๋ง ๋์ด๋๋ ์ ๋ํฌ ์ซ์๋ 17
์ด๋ค. 1
๊ณผ 3
์ ์์ ์ด๋ฃจ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ฒ์ฉ ๋์ด๋๊ณ ์๋ค. ์ด๋ฐ ๋ฐฐ์ด์์ ์ ๋ํฌ ๋๋ฒ(17
)๋ง ์ฐพ์๋ด๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
[1, 3, 17, 3, 1]
Naive Solution — O(n*n)
2์ค for
๋ฌธ์ ์ฌ์ฉํ ์์. ๋ชจ๋ ์ซ์๋ฅผ ํ๋ฒ์ฉ ๋์๊ฐ๋ฉด์ ๊ฒ์ฌํด์ผ ๋๊ธฐ ๋๋ฌธ์ O(n*n)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค. ๋ฐฐ์ด ๊ธธ์ด๊ฐ 5
๋ผ๋ฉด ์ ๋ต์ ์ฐพ์ ๋๊น์ง ์ต๋ 25๋ฒ
์ ์ํ๊ฐ ์ด๋ค์ง ์๋ ์๋ค.
function singleNumber(nums) {
for (let i = 0; i < nums.length; i++) {
let found = false;
for (let j = 0; j < nums.length; j++) {
if (nums[j] === nums[i] && i !== j) {
found = true;
break;
}
}
if (!found) return nums[i];
}
}
Linear Solution — O(n)
๐ก O(n)
์ ์๊ณ ๋ฆฌ์ฆ ์คํ ์๊ฐ์ด ์ ํ์ด ๋๋ ๊ฒ์ ๋ปํ๋ค. ์ ํ ์๊ฐ(Linear time; ็บฟๆงๆถ้ด)์ด๋ ๋ฐฐ์ด ๊ธธ์ด(n
)์ ๋น๋กํ๋ ๋งํผ์ ์๊ณ ๋ฆฌ์ฆ ์คํ ์๊ฐ์ด ํ์ํ ๊ฒ์ ๋งํ๋ค.
memo
๊ฐ์ฒด๋ฅผ ์ด์ฉํด 2๋ฒ ์ด์ ๋ฑ์ฅํ ์ซ์๋ฅผ ๊ธฐ์ตํ๋ ๋ฐฉ๋ฒ. for ๋ฌธ
์ ๋๋ฉด์ ์ฒ์ ๋์ค๋ ์ซ์๋ฅผ key๋ก ์ง์ ํ์ฌ ๊ฐ์ 1
๋ก ์ด๊ธฐํํ๊ณ , ์ด๋ฏธ ๋ฑ์ฅํ๋ ์ซ์๊ฐ ๋ ๋์จ๋ค๋ฉด 1
์ ๋ํ๋ค. ๋ชจ๋ ์ํ๋ฅผ ๋ง์น ํ memo
๊ฐ์ฒด์ ๊ฐ์ 1
๋ก ๊ฐ๋ key๋ ํ ๋ฒ๋ง ๋ฑ์ฅํ๋ ์ ๋ํฌ ์ซ์๋ค.
์๋ ์ฝ๋๋ nums
์ซ์๋งํผ ์ํํ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ O(n)
์ด ๋๋ค.
function findUniqueNumber(nums) {
const memo = {};
for (let i = 0; i < nums.length; i++) {
const num = nums[i];
memo[num] = (memo[num] || 1) + 1;
}
// memo -> { '1': 2, '3': 2, '17': 1 }
return Object.keys(memo).reduce((unique, num) => {
return memo[num] === 1 ? Number(num) : unique;
}, NaN);
}
Bitwise XOR Solution — O(n)
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 10์ง์ ๋จ์๋ก ์์
์ ์ฒ๋ฆฌํ์ง๋ง ๋นํธ ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ฉด 2์ง์๋ ์ฒ๋ฆฌ ํ ์ ์๋ค. XOR ^
์ฐ์ฐ์๋ ๋น๊ตํ๋ 2๊ฐ์ ๋นํธ๊ฐ ์๋ก ๋ค๋ฅด๋ฉด 1
, ๊ฐ์ผ๋ฉด 0
๋ฅผ ๋ฐํํ๋ค — ๋นํธ ์ฐ์ฐ์ ์ฐธ๊ณ (ํ๊ธ)
10 ^ 12; // 6
// 1010 (10)
// 1100 (12)
// ----
// 0110 (6) -> 1๊ณผ1 ๊ฐ์์ 0, 0๊ณผ1 ๋ฌ๋ผ์1, 1๊ณผ0 ๋ฌ๋ผ์ 1, 0๊ณผ0 ๊ฐ์์ 0
๊ฐ์ ์ซ์ 2๊ฐ๋ฅผ XOR ^
์ฐ์ฐ์ผ๋ก ๋น๊ตํ๋ฉด ํญ์ 0
์ด ๋์จ๋ค.
4 ^ 4 // 0;
// 100 (4์ ์ด์ง์)
// 100
// ---
// 000 (2์ง์ 000์ 10์ง์ 0)
๋ง์ฐฌ๊ฐ์ง๋ก ์(pairs)์ ํฌํจํ๋ ๋ฐฐ์ด์์, ๊ฐ ์์์ ํ๋ฒ์ฉ XOR ์ฐ์ฐ์ ์ํํ๋ฉด ๊ฒฐ๊ณผ๋ ํญ์ 0
์ด ๋๋ค. ๋์ผํ ์ง์ ๊ฐ์ง ์ซ์๋ค์ด ์ง์ ์ด๋ค ์ฐ์ฐ๋ผ์ ๊ฒฐ๊ณผ์ ์ผ๋ก 0
์ด ๋์ค๋ ๊ฒ. XOR ์ฐ์ฐ์๋ ๊ตํ๋ฒ์น(์ซ์ ์์น๋ฅผ ๋ฐ๊ฟ๋ ๊ฒฐ๊ณผ๊ฐ ๋ณํ์ง ์๋ ์ฑ์ง)๊ณผ ๊ฒฐํฉ๋ฒ์น(์ฐ์ฐ ์์๋ฅผ ๋ฐ๊ฟ๋ ๊ฒฐ๊ณผ๊ฐ ๋ณํ์ง ์๋ ์ฑ์ง)์ ๋ง์กฑํ๊ธฐ ๋๋ฌธ์ ์์์ ์๊ด์์ด ํญ์ ๋์ผํ ๊ฐ์ด ๋์จ๋ค. ์ฆ, [1, 1, 3, 3]
์ด๋ [3, 1, 3, 1]
์ด๋ ๋ฐฐ์ด์ ์ซ์๋ค์ด ๋ชจ๋ ์ง์ ์ด๋ฃฌ๋ค๋ฉด ๊ฒฐ๊ณผ๋ ํญ์ 0
์ผ๋ก ๋์ผํ๋ค.
[1, 3, 1, 3].reduce((val, num) => {
console.log(
`val: ${val}(${val.toString(2)}), num: ${num}(${num.toString(
2,
)}), val^num: ${val ^ num}(${(val ^ num).toString(2)})`,
);
return val ^ num;
});
// ๊ดํธ์์ 2์ง์
// val: 1(1), num: 3(11), val^num: 2(10)
// val: 2(10), num: 1(1), val^num: 3(11)
// val: 3(11), num: 3(11), val^num: 0(0)
์์ ํฌํจํ๋ ๋ฐฐ์ด์ ์ ๋ํฌ ์ซ์(17)๋ฅผ ์ถ๊ฐํ๋ฉด, ๊ฒฐ๊ณผ๋ ํญ์ ์ด ์ ๋ํฌ ์ซ์๊ฐ ๋๋ค. ์ ์ฌํ ์(1, 3) ์์๋ ์๋ก๋ฅผ ์์(ๆตๆถ)ํ๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ์ซ์์ ๋ํด XOR ์ฐ์ฐ์ ์ํํ๋ฉด ๊ฒฐ๊ตญ ๊ณ ์ ํ ๊ฐ์ ๊ฐ๋ ์ซ์(17)๋ง ๋จ๊ฒ ๋๋ค. XOR ์ฐ์ฐ์์ ์์๋ ์๊ด์๊ธฐ ๋๋ฌธ์ ์ ๋ํฌ ์ซ์๊ฐ ๋ฐฐ์ด ์ด๋์ ์์นํ๋ ๊ฒฐ๊ณผ๋ ํญ์ ๊ฐ๋ค.
[1, 3, 17, 1, 3].reduce((val, num) => {
console.log(
`val: ${val}(${val.toString(2)}), num: ${num}(${num.toString(
2,
)}), val^num: ${val ^ num}(${(val ^ num).toString(2)})`,
);
return val ^ num;
});
// ๊ดํธ์์ 2์ง์
// val: 1(1), num: 3(11), val^num: 2(10)
// val: 2(10), num: 17(10001), val^num: 19(10011)
// val: 19(10011), num: 1(1), val^num: 18(10010)
// val: 18(10010), num: 3(11), val^num: 17(10001)
์ด์ฒ๋ผ XOR ์ฐ์ฐ์ ์ด์ฉํด ์๋์ฒ๋ผ ๊น๋ํ๊ฒ ํ ์ค๋ก ์์ฑํ ์ ์๋ค. ๋นํธ ์์ค์์์ ํ๊ฐ๊ฐ ์ผ๋ฐ์ ์ธ ๋ ผ๋ฆฌ์ฐ์ฐ์๋ณด๋ค ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณตํ ์์๊ฐ ๋ง์ ์๋ก ๋นํธ ์ฐ์ฐ์ด ๋ ํจ์จ์ ์ด๋ค.
function findUniqueNumber(nums) {
return nums.reduce((val, num) => val ^ num);
}
๋ฒ์ธ — XOR ์ฐ์ฐ์ ๊ท์น
a ^ b
๋ฅผ ์ด์ฉํด ์ป์ ๊ฐ์ด c
๋ผ๋ฉด a
b
c
๋ ํญ์ ํ ์(pairs)์ด ๋๋ ๊ท์น์ด ์๋ค. ์ด ํ ์์์ ์์๋ก 2๊ฐ๋ฅผ ๊ณจ๋ผ XOR ์ฐ์ฐ์ ์ํํ๋ฉด ๊ฒฐ๊ณผ๋ ํญ์ ํ ์ ์ค ๋๋จธ์ง ๊ฐ์ด ๋์จ๋ค. — ์ฐธ๊ณ ๊ธ
let a = 3;
let b = 5;
let c = a ^ b; // 6
a ^ c; // 5 (b์ ๊ฐ)
b ^ c; // 3 (a์ ๊ฐ)
๋ ํผ๋ฐ์ค
How to find a unique number in a list containing pairs? - Yonatan Kra
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[React] ๋ฆฌ์กํธ ์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ(์ ๋ก๋) ๊ตฌํ / File API
[React] ๋ฆฌ์กํธ ์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ(์ ๋ก๋) ๊ตฌํ / File API
2024.05.02 -
[TS] ํ์ ์คํฌ๋ฆฝํธ - ๋๋ํ ์ฐ์ฐ์
[TS] ํ์ ์คํฌ๋ฆฝํธ - ๋๋ํ ์ฐ์ฐ์
2024.05.02 -
[Git] git revert, git reset ์ฐจ์ด์ ๋ฐ HEAD ๋ถ๋ฆฌ
[Git] git revert, git reset ์ฐจ์ด์ ๋ฐ HEAD ๋ถ๋ฆฌ
2024.05.01 -
[HTML/CSS] ์ค๋ฐ๊ฟ ์ ์ด ์์ฑ word-break / word-wrap(overflow-wrap)
[HTML/CSS] ์ค๋ฐ๊ฟ ์ ์ด ์์ฑ word-break / word-wrap(overflow-wrap)
2024.05.01