- ์ด ๊ธ์ ๊ณจ๋ ๋๋น ์ฝ๋ฉ ํ ์คํธ ํฉ๊ฒฉ์ ๋๊ธฐ ํ์ด์ฌ ํธ์ 10์ฅ ์จ๋จธ๋ฆฌ์ ๋๋ค.
๊ฐ๋ ์ ๋ฆฌ
์งํฉ์ ๊ฐ๋
- ์์์ ์ค๋ณต์ด ์๋ ์์๋ค์ ๊ฐ๋ ์๋ฃ๊ตฌ์กฐ. ex {1,6,6,6,4,3} -> {1,6,4,3} ์ผ๋ก ์๊ฐํด์ผ ํ๋ค.
- ์ํธ๋ฐฐํ์ ์งํฉ ์ ๊ต์งํฉ์ด ์๋ ์งํฉ ๊ด๊ณ
- A = {1,2,3}, B= {4,5,6,7} ๊ต์งํฉ์ด ์๋ ๊ด๊ณ๋ก ์ํธ๋ฐฐํ์ ์งํฉ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
- ์ํธ ๋ฐฐํ์ ์งํฉ์ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ดํด์ ํ์ธํ๋ ์์ ์ ๋ง์ด ํ์ฉ
- ๊ทธ ์ธ ์ด๋ฏธ์ง ๋ถํ , ๋๋ก ๋คํธ์ํฌ ๊ตฌ์ฑ, ์ต์ ์ ์ฅ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ, ๊ฒ์ ๊ฐ๋ฐ, ํด๋ฌ์คํฐ๋ง ์์ ๋ฑ ์์ ํ์ฉ ๋ ์ ์๋ค.
์งํฉ ํํ
- ์งํฉ์ ๋ฐฐ์ด์ ํ์ฉํ ํธ๋ฆฌ๋ก ๊ตฌํ.
- ์ฆ, ํ๋์ ๋ฐฐ์ด๋ก ์ํธ ๋ฐฐํ์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ ์งํฉ์ ๋ชจ๋ ํํํ๋ค.
disjoint_set[2] = 1
์ ์๋ฏธ๋ ๋ ธ๋ 2์ ๋ถ๋ชจ๋ ธ๋๋ 1์ด๋ค.disjoint_set[1]=1
์ ๊ฒฝ์ฐ ๋ฃจํธ๋ ธ๋์ธ 1์ ์งํฉ์ ๋ํ ์ด๋ฏ๋ก(=๋ํ ๋ ธ๋), ๋ถ๋ชจ๋ ธ๋๊ฐ ๊ณง ์๊ธฐ์์ ์ด ๋๋ค.
์ ๋์จ-ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ
- ์งํฉ ์๊ณ ๋ฆฌ์ฆ์์ ์ฃผ๋ก ์ฐ์ด๋ ์ฐ์ฐ์ด๋ค.
- ์ ๋์จ-ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ์์ ์ฐ์ฐ์ ์์๋ ์ฃผ๋ก ํ์ธ๋๊ฐ ๋จผ์ ๊ณ ์ ๋์จ์ด ๋์ค์ ์ฐ์ฐ๋๋ค.
ํ์ธ๋ ์ฐ์ฐ
- ํ์ธ๋ ์ฐ์ฐ์ ํ์ฌ๋ ธ๋์์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์์๋๋ก ๋ฐ๋ผ๊ฐ๋ฉด์ ๋ง์ง๋ง ๋ถ๋ชจ๋ ธ๋๋ฅผ ์ฐพ์ ๋ถ๋ชจ๋ ธ๋๋ฅผ ๋ฆฌํดํ๋ ์ฐ์ฐ์ด๋ค.
- ํ์ ์ฐ์ฐ์ ์ฌ๊ทํจ์๋ก ํ๊ฒ๋๋ฉด ํ์ฌ ๋ ธ๋๊ฐ ๋ถ๋ชจ๋ ธ๋์ ๊ฐ์ ๋๊น์ง ์ฌ๊ท ํจ์๋ฅผ ํธ์ถํ๋ค.
- ๋ ธ๋ 7 ์ ๋ฃจํธ๋ ธํธ๋ 1 ์ด๋ค.
- ์๊ฐ๋ณต์ก๋๋ ์ต์ ์ ๊ฒฝ์ฐ O(N)
- ๊ฒฝ๋ก์์ถ ์ ํตํด ์ฐ์ฐ ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
์ ๋์จ ์ฐ์ฐ
- ๋ ์งํฉ์ ํ๋๋ก ํฉ์น๋ ์ฐ์ฐ.
- ์ฆ, ๋์งํฉ์ ๋ฃจํธ๋ ธ๋๋ฅผ ๊ฐ๊ฒ ํ๋ ์ฐ์ฐ.
- ๋ ์งํฉ์์ ๊ฐ๊ฐ ํ์ธ๋ ์ฐ์ฐ์ ์ด์ฉํ์ฌ ๋ฃจํธ๋ ธํธ๋ฅผ ์ฐพ์ ๋ด์ด ํ ์ชฝ์ ๋ฃจํธ๋ ธ๋๋ฅผ ๋ค๋ฅธ ์งํฉ ๋ฃจํธ ๋ ธ๋์ ์ฐ๊ฒฐํ๋ค.
- ๋ ์งํฉ ์ค ์ด๋ค ๋ฃจํธ ๋ ธ๋๋ก ํด๋ ์๊ด ์๋ค.
- ์์ ๊ฐ์ ์ฐ์ฐ์ ํธ๋ฆฌ์ ๊น์ด๊ฐ ๊น์ด์ง ์๋ก ์ฐ์ฐ ๋น์ฉ์ด ์ปค์ง๋ ๋จ์
- ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ญํฌ ๊ธฐ๋ฐ์ผ๋ก ์ ๋์จ ์ฐ์ฐ์ ํ๋ค.
- ๋ญํฌ ๊ธฐ๋ฐ ์ ๋์จ ์ฐ์ฐ์ ๊ฐ ์งํฉ์ ํธ๋ฆฌ๊น์ด๋ฅผ ๋น๊ตํ์ฌ ์์ ํธ๋ฆฌ์ ๊น์ด๋ฅผ ๊ฐ์ง ๋ฃจํธ๊ฐ ํฐ ํธ๋ฆฌ์ ๊น์ด๋ฅผ ๊ฐ์ง ์งํฉ์ ํฉ์ณ์ง๋ค.
- ์ฆ ๋ญํฌ ๊ธฐ๋ฐ์ ์ ๋์จ ์ฐ์ฐ์ ํธ๋ฆฌ์ ๊ท ํ์ ์ ์งํ๊ธฐ ์ํจ์ด๋ค.
๋ฌธ์ ํ๊ธฐ
1.ํฐ์ผ๋ชฌ
ํ๋ก๊ทธ๋๋จธ์ค ํฐ์ผ๋ชฌ ๋ฐ๋ก๊ฐ๊ธฐ
์ด ๋ฌธ์ ๋ ์ฃผ์ด์ง ๋ฐฐ์ด์์ ํฐ์ผ๋ชฌ ์ข ๋ฅ์ ๊ฐ์๋ฅผ ์ธ์ด n/2๋ณด๋ค ์์ผ๋ฉด ํฐ์ผ๋ชฌ ์ข ๋ฅ ๊ฐ์๋ฅผ, ํฌ๋ค๋ฉด ์ต๋ ํฐ์ผ๋ชฌ ์ข ๋ฅ๋ฅผ ์ ํํ๋ n/2๋ฅผ ๋ฆฌํดํ๋ค. ์ฃผ์ด์ง ํฐ์ผ๋ชฌ์ ๊ธธ์ด๊ฐ 10,000 ์ดํ์ด๋ O(n) ์ด๋ฉด ์ถฉ๋ถ ํ๋ค. ํฐ์ผ๋ชฌ ์ข ๋ฅ๋ ํด์ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ {ํฐ์ผ๋ชฌ ์ข : ๊ฐ์ } ๋ก ์ ์ฅํ๋ค.
function solution(nums) {
const hashTable = {}
for (const num of nums) {
hashTable[num] = (hashTable[num] || 0) + 1
}
const pocketmonSpeicesNum = Object.keys(hashTable).length
return pocketmonSpeicesNum > nums.length / 2
? nums.length / 2
: pocketmonSpeicesNum
}
2. ์์ด ๋๋ง์๊ธฐ
์์ด ๋๋ง์๊ธฐ ํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ก๊ฐ๊ธฐ
์ด ๋ฌธ์ ๋ ๋๋ง์๊ธฐ์ ๊ท์น์ ์ ์ ์ฉํ์ฌ ๊ท์น์ ์ด๊ธด ๊ฒฝ์ฐ ์์ ์ ํ๋ฝํ๋ ์ฌ๋ ๋ฒํธ์ ํ๋ฝํ๋ ์ฌ๋์ด ๋ช ๋ฒ์งธ ์ฌ์ดํด์ธ์ง๋ฅผ ์ ํธ๋ํน ํ ์ ์๋๋ก ๊ตฌํ ํ๋๊ฒ ์ค์ํ๋ค.
๊ท์น์ค ์ด์ ์ ๋ฑ์ฅํ๋ ๋จ์ด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๊ฒฝ์ฐ๋ ์๋ฃ๊ตฌ์กฐ set
์ ์ฌ์ฉํ์ฌ set์ size ์ ํ์ฌ ์์๋ฅผ ๋น๊ตํ์ฌ ๋ค๋ฅด๋ฉด ์ค๋ณต๋ ๋จ์ด๋ผ๊ณ ๊ฐ์ฃผํ์ฌ ๊ตฌํํ๋ค.
์๊ฐ๋ณต์ก๋๋ O(n)์ผ๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
function solution(n, words) {
const wordSet = new Set()
let answer = [0, 0]
words.every((word, i) => {
let isRuleBroken = false
wordSet.add(word)
if (wordSet.size !== i + 1) isRuleBroken = true
if (word.length <= 1) isRuleBroken = true
let prev = words[i - 1]
if (prev && prev[prev.length - 1] !== word[0]) isRuleBroken = true
if (isRuleBroken) {
let number = (i + 1) % n === 0 ? n : (i + 1) % n
let nth = Math.ceil((i + 1) / n)
answer = [number, nth]
return false
}
return true
})
return answer
}
3. ์ ํ๋ฒํธ ๋ชฉ๋ก
์ ํ๋ฒํธ ๋ชฉ๋ก ํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ก ๊ฐ๊ธฐ
์ฃผ์ด์ง ์ ํ๋ฒํธ ๋ฆฌ์คํธ ๋ด์์ ํ๋์ ์ ํ๋ฒํธ๊ฐ ๋ค๋ฅธ ์ ํ๋ฒํธ์ ์ ๋์ด๊ฐ ๋๋ฉด false
๋ฅผ ๋ฐํํ๊ณ ๊ทธ๋ ์ง ์๋ค๋ฉด true
๋ฅผ ๋ฐํํ๋ค.
์ด ๋ฌธ์ ๋ ์ ํ๋ฒํธ ๋ฆฌ์คํธ๊ฐ 1,000,000 ์ด๋ผ๋ ์ ์์ ํจ์จ์ฑ์ ๊ณ ๋ คํ์ฌ ๊ตฌํํด์ผ ํ๋ ์ ์ด ์ค์ํ๋ค.
brute force ๋ฐฉ์์ผ๋ก ๊ฐ๊ฐ ์ ํ๋ฒํธ ํ๋์ ๋๋จธ์ง ์ ํ๋ฒํธ๋ฅผ ๋ชจ๋ ์ํํ๋ฉด ์๊ฐ๋ณต์ก๋๊ฐ O(N^2)์ด ๋๋ฏ๋ก ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค.
๊ทธ๋์ ์๊ฐํ ์ ๊ทผ๋ฒ์ ๊ธธ์ด๊ฐ ์งง์ ์์๋๋ก ์ ๋ ฌ ํ ์ํํ๋ฉด์ ๊ฐ์ ๋ฒํธ ํน์ ํ๋์ ์ ํ๋ฒํธ์ ๋ถ๋ถ ๋ฒํธ๊ฐ set์ ์์ผ๋ฉด set์ ์ถ๊ฐ ํ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋์ set ๋ด์ ์๋ค๋ฉด false๋ฅผ ๋ฆฌํดํ๋ ๋ฐฉ์์ด๋ค.
์ด ๋ฌธ์ ๋ ์๊ฐ ๋ณต์ก๋ ๋ฉด์์ ์ต์
์ ๊ฒฝ์ฐ 2์ฒ๋ง ์ผ๋ก ํต๊ณผ๋ ํ์ง๋ง ๋ณต์ก๋๋ฅผ ๋ ๊ฐ์ ํ ์ฌ์ง๊ฐ ์๋ค.
์ ํ๋ฒํธ ๋ฆฌ์คํธ ๊ธธ์ด 1,000,000 * ํ๋์ ์ ํ๋ฒํธ ๊ธธ์ด 20 = 20,000,000
function solution(phone_book) {
const set = new Set()
// ๊ธธ์ด๊ฐ ์งง์ ์์ผ๋ก ์ ๋ ฌ- ์ ๋์ด๊ฐ ๋ ์ ์๋ ์ซ์๋ฅผ set์์ ์ฐพ๊ธฐ ์ํด
phone_book.sort((a, b) => a.length - b.length)
for (const phoneNum of phone_book) {
if (set.has(phoneNum)) return false //๊ฐ์ ๋ฒํธ ์์ผ๋ฉด false
let prefix = ''
for (let i = 0; i < phoneNum.length; i++) {
prefix += phoneNum[i]
if (set.has(prefix)) return false
}
set.add(phoneNum)
}
return true
}
์ฑ๋ฅ ์ต์ ํ
some
๋ด์ฅ ํจ์ ์ฌ์ฉ: ๋ฐฐ์ด์ ์์ ์ค ํ๋๋ผ๋ true์ด๋ฉด ๋ฉ์ถ๊ณ true๋ฅผ ๋ฐํstartsWith
๋ด์ฅ ํจ์ ์ฌ์ฉ : ๋ฌธ์์ด์ด ํน์ ๋ฌธ์์ด๋ก ์์ํ๋์ง ํ์ธ- ์ ๋ ฌ ํ, ๋ค์ ์์๊ฐ ํ์ฌ ์์๋ก ์์ํ๋ ์ง ํ์ธ, ์์ํ๋ฉด true ๋ฐํ ํ ์ํ๋ฅผ ๋ฉ์ถ๋ค.
- ๋ฌธ์ ์๊ตฌ ์ฌํญ์์๋ false๋ก ๋ฐํํด์ผ ํ๋ฏ๋ก ! ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
- ๋ง์ง๋ง ์์๊น์ง ์ํ ํ๋ค๋ ๊ฒ์, ์ด์ ์์์ ์ ๋์ด ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ์์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก, ๋์ด์์ ์ํ๋ ํ์์์.
- ๋ฐ๋ผ์ ๋ง์ง๋ง ์์๋ฅผ ์ํํ์ ๋๋ false๋ฅผ ๋ฐํ.
- O(nlogn)
function solution1(phone_book) {
return !phone_book.sort().some((t, i) => {
if (i === phone_book.length - 1) return false //๋ง์ง๋ง ์ธ๋ฑ์ค๋ false๋ฅผ ๋์ด ๋ฌด์กฐ๊ฑด true๋ฅผ ๋ฐํํ์ง ์๋๋ก
return phone_book[i + 1].startsWith(phone_book[i])
})
}
4. ์ฌ ์ฐ๊ฒฐํ๊ธฐ
์ด ๋ฌธ์ ๋ MST๋ฅผ ๊ทธ๋๋ก ๊ตฌํํ ๋ฌธ์ ๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ฅธ ์ํ๋ก ์๊ฐํ ์ ๊ทผ๋ฒ์
์ฐ๊ฒฐ๋์ด ์๋ ๋ ธ๋๊ฐ์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ๋ค์,
min( find(0)+find(1), find(0)+find(2)) ์ ํตํด ๋งค ๋ ธ๋์ ์ฐ๊ฒฐ๋์ด์๋ ๊ฐ์ฅ ์์ ๊ฐ์ ๋ ธ๋๋ฅผ ์ฐพ์ ์ฐ๊ฒฐ์ํค๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ์ง๋ง ๊ณ์ ์คํจํ๋ฉฐ ์ฝ์ง ์์๋ค.
์ต์์ ์ฅ ํธ๋ฆฌ๋ฅผ ํ์ธํด๋ณด๋, ์ ๊ทผ์์ฒด๊ฐ ๋ฌ๋๋ค.
๋ด ์ ๊ทผ์ ๋ฌธ์ ์ ์
- ์ ๋ ฌ์ ํ์ง ์์ ๋ชจ๋ ๋ ธ๋์ find๋ฅผ ์ฐพ๊ธฐ ์ํด ๊ฑฐ์น๋ ๊ฐ์ค์น์ ํฉ์ ๊ตฌํ๋ ๋ถ๋ถ์์ ์ฌ์ดํดํธ๋ค๋ง์ด ์ด๋ ค์ ์. - ์ด ๋ถ๋ถ์ ๊ฐ์ค์น๊ฐ ์์ ์์๋๋ก ์ ๋ ฌ๋ก ์ ๊ทผ.
- ๋ชจ๋ ์ฃ์ง๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์ ์ ์ด๋ ์์ ์ ์ ์ ์๋์ง์ ๋ํ ์๋ฌธ์ ํด๊ฒฐํ์ง ๋ชปํ๋ค. ์ด ๋ถ๋ถ์ ์๋ฐฉํฅ ์ธ์ ๋ฆฌ์คํธ๊ฐ ์๋ ์์ง ๋ฆฌ์คํธ ํํ๋ก ์ ์งํด์ผ ํ์๊ณ (์ฌ์ดํด ํธ๋ค๋ง์ด ์ฌ์์ง), ๋ชจ๋ ์ฃ์ง๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์ ์ ํธ๋ฆฌ์ ๊ทธ๋ํ์ ์ฐจ์ด์ธ ๊ทธ๋ํ ๊ฐ์ ์ ๊ฐ์๋ ๋ ธ๋ ๊ฐ์๋ณด๋ค -1 ๊ฐ์ธ์ ์ ํ์ฉํ์ฌ ํด๊ฒฐ.
โ ์๋ํ ์ ๊ทผ๋ฒ
โ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ ๋ฐ์ ํ ์์ค์ฝ๋
function solution(n, costs) {
var answer = 0
const disjoint = Array.from({ length: n }, (_, i) => i)
let edgeNum = 0
//๊ฐ์ค์น ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ (pop()ํ๊ธฐ ์ํด )
costs.sort((a, b) => b[2] - a[2])
while (edgeNum < n - 1) {
if (!costs.length) break
const [a, b, cost] = costs.pop()
// ์งํฉ์ ๋ํ๋
ธ๋๋ฅผ ์ฐพ์ ์ฌ์ดํด์ธ์ง ํ์ธ
const rootA = find(a, disjoint)
const rootB = find(b, disjoint)
//์ฌ์ดํด์ด ์๋๋ผ๋ฉด union
if (rootA !== rootB) {
union(rootA, rootB, disjoint)
edgeNum += 1
answer += cost
}
// ์ฌ์ดํด์ด๋ผ๋ฉด continue
}
return answer
}
function find(target, disjoint) {
if (disjoint[target] === target) return target
return (disjoint[target] = find(disjoint[target], disjoint))
}
function union(a, b, disjoint) {
disjoint[a] = b
return
}