๊ณจ๋ ๋๋น ์ฝ๋ฉ ํ ์คํธ ํฉ๊ฒฉ์ ๋๊ธฐ ํ์ด์ฌ ํธ์ 9์ฅ ์จ๋จธ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
๊ฐ๋ ์ ๋ฆฌ
์ด์งํธ๋ฆฌ ํํํ๊ธฐ
- ์ด์ง ํธ๋ฆฌ๋ ํธ๋ฆฌ์ ํ ์ข ๋ฅ๋ก ๋ชจ๋ ๋ ธ๋์ ์ต๋ ์ฐจ์๊ฐ 2๋ฅผ ๋์ง ์๋ ํธ๋ฆฌ. ์ฆ, ์ต๋ 2๊ฐ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง ์ ์๋ค. (์์ ๋ ธ๋ 0,1,2 ๊ฐ๋ฅ)
- ์ด์ง ํธ๋ฆฌ๋ ๋ฐฐ์ด์ด๋ ํฌ์ธํฐ๋ก ๊ตฌํ ๊ฐ๋ฅ
์ด์งํธ๋ฆฌ ๋ฐฐ์ด๋ก ํํ
- ๋ฃจํธ ๋ ธ๋๋ ๋ฐฐ์ด ์ธ๋ฑ์ค 1 ๋ฒ์ ์ ์ฅ
- ์ผ์ชฝ ์์ ๋ ธ๋ : ๋ถ๋ชจ ๋ ธ๋ ๋ฐฐ์ด ์ธ๋ฑ์ค *2
- ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ : ๋ถ๋ชจ ๋ ธ๋ ๋ฐฐ์ด ์ธ๋ฑ์ค *2+1
TIP . ๋ฐฐ์ด์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๊ฐ 0๋ถํฐ ์์ํ๋ฏ๋ก ์ผ์ชฝ์์ ๋ ธ๋๋
๋ถ๋ชจ ๋ ธ๋ ๋ฐฐ์ด ์ธ๋ฑ์ค*2+1
, ์ค๋ฅธ์ชฝ ์์๋ ธ๋๋๋ถ๋ชจ ๋ ธ๋ ๋ฐฐ์ด ์ธ๋ฑ์ค*2+2
- ์ด์งํธ๋ฆฌ ์์ฑ ์๊ฐ๋ณต์ก๋ : O(n)
์ด์งํธ๋ฆฌ ์ํํ๊ธฐ
[1,2,3,4,5,6,7]
๊ฐ ์ฃผ์ด์ก์ ๋,
- ์ ์ ์ํ(Pre-order) : ๋ถ๋ชจ ๋
ธ๋๊ฐ (pre) ๋จผ์ ์ํ๋๋ค.
1-2-4-5-3-6-7
์์. - ์ค์ ์ํ(In-order) : ๋ถ๋ชจ ๋
ธ๋๊ฐ ์ค๊ฐ์ด ๋๋ค. ์ผ์ชฝ ์ฐจ์ผ๋์์ ์์ ๋ฆฌํด ๋์ด ๋์จ ๋ค์์ ์์๊ฐ ๋๋ค.
4-2-5-1-6-3-7
์์. - ํ์ ์ํ(Post-order): ๋ถ๋ชจ ๋
ธ๋๊ฐ ๋ง์ง๋ง์ด ๋๋ค. ์ค๋ฅธ์ชฝ์์ ๋ฆฌํด ๋์ด ๋์จ ๋ค์์ ์์๊ฐ ๋๋ค.
4-5-2-6-7-3-1
์์.
์์ ๋ชธํ๊ธฐ ๋ฌธ์ 26. ํธ๋ฆฌ ์ํ ์ฐธ๊ณ
[1,2,3,4,5]
๋ฐฐ์ด์ด ์ฃผ์ด์ก์ ๋,
function solution(nums) {
return [
preorder(0, nums, []).join(" "),
inorder(0, nums, []).join(" "),
postorder(0, nums, []).join(" "),
];
}
/**
*
* 0๋ถํฐ ์์ํ๋ ๊ฒฝ์ฐ ์ธ๋ฑ์ค ์ค์ ์ ๊ธฐ์กด ์ค์ ์์ +1๋ก ์ธํ
* preorder: ๋ถ๋ชจ๊ฐ pre๊ฐ ๋๋ค.
*
* @param {*} root
* @param {*} nums
* @param {*} result
* @returns
*/
function preorder(root, nums, result) {
if (!nums[root]) return;
result.push(nums[root]);
preorder(root * 2 + 1, nums, result); //left
preorder(root * 2 + 2, nums, result);
return result;
}
/**
* inorder :๋ถ๋ชจ๊ฐ ์ค๊ฐ์ด ๋๋ค. ์ผ์ชฝ์์ ๋ฆฌํด๋์ด ๋์จ ๋ค์์ ์์.
* @param {*} root
* @param {*} nums
* @param {*} result
* @returns
*/
function inorder(root, nums, result) {
if (!nums[root]) return;
inorder(root * 2 + 1, nums, result);
result.push(nums[root]);
inorder(root * 2 + 2, nums, result);
return result;
}
/**
* postorder: ๋ถ๋ชจ๊ฐ ๋ง์ง๋ง์ด ๋๋ค. ์ค๋ฅธ์ชฝ์์ ๋ฆฌํด๋์ด ๋์จ ๋ค์์ ์์.
* @param {*} root
* @param {*} nums
* @param {*} result
* @returns
*/
function postorder(root, nums, result) {
if (!nums[root]) return;
postorder(root * 2 + 1, nums, result);
postorder(root * 2 + 2, nums, result);
result.push(nums[root]);
return result;
}
assert.deepEqual(solution([1, 2, 3, 4, 5, 6, 7]), [
"1 2 4 5 3 6 7",
"4 2 5 1 6 3 7",
"4 5 2 6 7 3 1",
]);
์ด์ง ํธ๋ฆฌ ํ์ํ๊ธฐ
- ์ด์ง ํ์ ํธ๋ฆฌ(Binary Search Tree)๋ ์ด์ง ํธ๋ฆฌ(Binary Tree)์์ ์ํ๋ ๋ ธ๋๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ ํ ์ ์๋๋ก ๋ง๋ ํธ๋ฆฌ ์ด๋ค.
์ด์ง ํ์ ํธ๋ฆฌ ๊ตฌ์ถํ๊ธฐ
- ํฌ์ธํธ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ์ฝ์ ํ๋ฉด์, ์ด์ง ํธ๋ฆฌ ํ์์ ๊ตฌ์ถ. (์ฝ์ ๊ณผ ๋์์ ์ ๋ ฌ)
- ํ๋์ฉ ์ฝ์ ํ ๋ ์ถ๋ฐ์ ๋ฃจํธ ๋ ธ๋ ๋ถํฐ ํ์ํ์ฌ ๋ถ๋ชจ ๋ ธ๋ ๋ณด๋ค ์์ผ๋ฉด ์ผ์ชฝ ์ฐจ์ผ๋, ๋ถ๋ชจ ๋ ธ๋ ๋ณด๋ค ํฌ๋ค๋ฉด ์ค๋ฅธ์ชฝ ์ฐจ์ผ๋์ ์ฝ์ ํ๋ค.
- ๋ง์ฝ ์ฝ์ ํ๋ ค๋ ์๋ฆฌ์ ์ด๋ฏธ ์ฐจ์ผ๋๊ฐ ์๋ค๋ฉด, ๊ทธ ์ฐจ์ผ๋๋ฅผ ๋ถ๋ชจ๋ ธ๋๋ก ๊ฐ์ฃผํ๊ณ ๊ฐ์ ๋น๊ต๋ฅผ ํตํด ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ ์ฐจ์ผ๋๋ก ํ์ํ์ฌ ๋ ์ด์ ์ฐจ์ผ๋๊ฐ ์๋ ๊ณณ์ ์ฝ์ ํ๋ค.
์ด์ง ํ์ ํธ๋ฆฌ ํ์ํ๊ธฐ
- ํ์ ์๊ณ ๋ฆฌ์ฆ์์ ํ์ ํจ์จ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ํ์ ๋์์ด ์๋ ๋ ธ๋๋ฅผ ํ๋ฒ์ ๋ง์ด ์ ์ธ.
- ์ด์ง ํ์ ํธ๋ฆฌ์์๋ ์ด ๋ฐฉ๋ฒ์ด ์ ์ฉ ๊ฐ๋ฅ-> ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ๊ฐ ํ์ฌ ๋ ธ๋๋ณด๋ค ํฌ๋ฉด ์ค๋ฅธ์ชฝ, ์์ผ๋ฉด ์ผ์ชฝ์ ํ์ํ์ฌ ๋ฐ์ดํฐํฌ๊ธฐ์ ์ ๋ฐ์ ์ค์ผ ์ ์์.
- ์ฐพ์ผ๋ ค๋ ๊ฐ์ด ํ์ฌ๋ ธ๋๊ฐ๊ณผ ๊ฐ์ผ๋ฉด ํ์ ์ข ๋ฃ. ํฌ๋ฉด ์ค๋ฅธ์ชฝ ํ์
- ์ฐพ์ผ๋ ค๋ ๊ฐ์ด ํ์ฌ ๋ ธ๋ ๊ฐ๋ณด๋ค ์์ผ๋ฉด ์ผ์ชฝ ๋ ธ๋ ํ์.
- ๊ฐ์ ์ฐพ์ผ๋ฉด ์ข ๋ฃ.
์ด์ง ํ์ ํธ๋ฆฌ ์๊ฐ ๋ณต์ก๋
- ํธ๋ฆฌ ๊ท ํ์ ์์กด - ๋ ธ๋์ ์ฐจ์๊ฐ ๋น์ทํ๊ฒ ์ ์ง & ์์ ๋ ธ๋์๊ฐ ๋น์ทํ๊ฒ ์ ์ง ๋๋ ๊ฒฝ์ฐ ๊ท ํ์ด ์กํ๋ค๋ผ๊ณ ๊ฐ์ฃผ. - ๊ท ํ์ด ์กํ ํธ๋ฆฌ : O(logN) - ์) ๊ท ํ ์ด์ง ํ์ ํธ๋ฆฌ(Balanced Binary Search Tree) - ๊ท ํ์ด ๋ง์ง ์์ ํธ๋ฆฌ:O(N) - ์) ๋ณ์ง ํธ๋ฆฌ( Degenerate Binary Tree) : O(N)
๋ฌธ์ ํ๊ธฐ
1. ์์ ๋์งํ (์ถ์ฒ : ํ๋ก๊ทธ๋๋จธ์ค )
์ด ๋ฌธ์ ์ ํฌ์ธํธ๋
[1 2] [3 4] [5 6] [7 8]
[1] [2] [3] [4]
[1] [2]
์ฃผ์ด์ง ์ฐจ๋ก์์ 2๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ฐ์ ํตํด ๋ค์ ๋์ง ์์๊ฐ ๋๋ค.
/**
*
* @param {*} n
* @param {*} a
* @param {*} b
* @returns
*/
function solution(n, a, b) {
let cnt = 0;
// ์ฌ๋ฆผ์ ์ฌ์ฉํ์ฌ 2๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ฐ์ ๋ง๋ ๋ค. a ์ b๊ฐ ๊ฐ์ ๋๊น์ง
while (a !== b) {
a = Math.ceil(a / 2); //round๋ ์๊ด์์
b = Math.ceil(b / 2);
cnt += 1;
}
return cnt;
}
2.๋ค๋จ๊ณ ์นซ์ ํ๋งค
๋ด๊ฐ ์๊ฐํ๋ ๋ฌธ์ ์ ํฌ์ธํธ๋ ํ๋งค์์ ์ถ์ฒ์ธ๋ค์ ๋ฐ๋ผ๊ฐ๋ฉด์ ์ด์ต์ ๋ถ๋ฐฐํ๋ ๊ณผ์ ์์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌํํ ๊ฒ์ธ๊ฐ์ ์ด์ต์ ๋ถ๋ฐฐํ ๋ ์ด์ต์ 10%๋ ์กฐ์ง์ ๊ฐ ๋ฉค๋ฒ๊ฐ ๊ฐ์ง ์ด์ต์์ 10%๊ฐ ์๋ ์ฒ์ ํ๋งค์์ผ๋ก ๋ถํฐ ๋์จ ์ด์ต๊ธ์ 10%, ์ด ์ด์ต๊ธ์ 10%๋ก ์ด์ต๊ธ์ ๋ถ๋ฐฐํ๋ค.
ํธ๋ฆฌ๊ตฌ์กฐ๋ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํ์ฉํ์ฌ ์ถ์ฒ์ธ์ ๋ฐ๋ผ๊ฐ ์ ์๊ฒ O(1)์ ๋ณต์ก๋๋ก ๊ตฌํํ๋๊ฑด ์ด๋ ต์ง ์์๋ค. ๋ฌธ์ ๋ ์ถ์ฒ์ธ์ด ์์๋ while๋ฌธ์ผ๋ก ์ถ์ฒ์ธ์ด ์์ ๋๊น์ง ์ด์ต์ ๋ถ๋ฐฐํ๋๊ฒ์ธ๋ฐ, ์ด์ต ๋ถ๋ฐฐ ๊ณ์ฐ์ ํ์ฌ ์ถ์ฒ์ธ์ด ๋ฐ์ ์ด์ต์ 10%๋ฅผ ๊ณ์ฐ, ํ๋งค์๋ 10%๋ฅผ ๋บ ๊ธ์ก์ ์ด์ต์ ๊ณ์ฐํด์ผ ํ๋ค.
๋ฌธ์ ์์ ์ธ๊ธํ ์ด์ต์ด 1๋ณด๋ค ์์๊ฒฝ์ฐ๋ ๋ถ๋ฐฐํ์ง ์๋๋ค ๋ฅผ while๋ฌธ์ ์กฐ๊ฑด์ผ๋ก ์ํ๋ฅผ ํ์ง ์๋ ๊ฒ์ผ๋ก ํด์ผ ์๊ฐ์ด๊ณผ๋ฅผ ๋ฉด ํ ์ ์๋ค.
function solution(enroll, referral, seller, amount) {
const adjacentList = new Map();
enroll.forEach((seller, i) => {
adjacentList.set(seller, { referral: referral[i], profit: 0 });
});
for( const idx in seller){
let initialAmount = amount[idx] * 100;
let referral = adjacentList.get(seller[idx]);
let profit = 0;
while( initialAmount>=1 && referral){
profit = Math.floor(initialAmount*0.1) //10%
referral.profit+= initialAmount-profit //10%
initialAmount = profit
referral = adjacentList.get(referral.referral);
}
}
return enroll.map(seller => adjacentList.get(seller).profit);
}
3.๋ฏธ๋กํ์ถ
4. ์๊ณผ๋๋
์ด ๋ฌธ์ ๋ ๋จ์ํ๊ฒ bfs์์ ์์ด ๊ฐ์ฅ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ ์๊น์ง ๊ตฌํ์ ๋ max๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ฌด ์ฝ๊ฒ ์๊ฐํ๊ฒ ๋ฌธ์ ๋ค. ๋ฌธ์ ์์ ์๊ตฌํ๋ ๊ฒ์ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ๋ก์ ๊ธธ์ ๊ฐ์ ๋ ์ก์ ๋จนํ์ง ์๋ ์ํ์์ ์ต๋ ์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค.
bfs๋ก ํ์์ ๊ฒฝ์ฐ, 0๋ฒ ์์์ ์ธ์ ํ 1,8๋ฒ ๋ ธ๋๊ฐ ์๋๋ฐ 1๋ฒ์ผ๋ก ๊ฐ๊ฒ๋๋ฉด ์์ด 2๊ฐ ์ด๋ฏ๋ก ๊ณ์ํด์ ๋ ๋์๊ฐ๊ณ , 8๋ฒ ๋ ธ๋์ ๊ฒฝ์ฐ ์1, ๋๋1๋ก ์์ด ์ก์๋จนํ๋ฏ๋ก ๋ด ํ์ด์์๋ 8์ ๋ค์๋ ๊ฐ์ง์๋๋ค. ํ์ง๋ง 8์ ๊ผญ 0๋ค์์ ๊ฐ์ผ ํ๋๊ฑด ์๋๋ค. ๋ค๋ฅธ ๊ณณ์ ๋ค๋ ธ๋ค๊ฐ ์ต๋ํ ์์ ๋ชจ์ ๋ค์ 8๋ก ๊ฐ ์ ์๋ค. ์ด ๋ถ๋ถ์ ๊ตฌํํ๊ธฐ ์ํด์ ํ์ ๋ค์ด๊ฐ๋ ๋งค ๋ ธ๋๋ง๋ค ์กฐ๊ฑด์ ์ํด ๋ฐฉ๋ฌธ ๋ชปํ 8์ ๊ณ์ ์ผ๋ก ๋ค๊ณ ์์ด์ผ ํ๋ค.
โ ์๋ชป๋ ํ์ด
function solution(info, edges) {
let queue = [];
let adjacentList = {}
for(const [from, to] of edges){
adjacentList[from] = adjacentList[from] ||[]
adjacentList[from].push(to)
}
let max = 0
queue= [{node:0 , curShip:1, curWolf:0 }]
while(queue.length){
let {node, curShip, curWolf }= queue.shift();
max = Math.max(max, curShip)
let nextNodes = adjacentList[node];
// console.log(queue,node, curShip,curWolf,nextNodes)
if(!nextNodes) continue
for( const nextNode of nextNodes){
let nextShip= info[nextNode] ===0? curShip+1 : curShip
let nextWolf = info[nextNode]===1?curWolf+1: curWolf
if(nextShip>nextWolf){
queue.push({node:nextNode, curShip: nextShip, curWolf: nextWolf })
}
}
}
return max
}
โ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ๋งค ํ์ ๋ฃ์ด์ฃผ๋ ์ฝ๋
function solution(info, edges) {
let queue = [];
let adjacentList = {}
for(const [from, to] of edges){
adjacentList[from] = adjacentList[from] ||[]
adjacentList[from].push(to)
}
let max = 0
queue= [{node:0 , curShip:1, curWolf:0, availableNodes:[] }]
while(queue.length){
let {node, curShip, curWolf,availableNodes }= queue.shift();
max = Math.max(max, curShip)
let nextNodes=adjacentList[node]
if(nextNodes) availableNodes=[...availableNodes, ...nextNodes]
for( const nextNode of availableNodes){
if(info[nextNode]){
if(curShip !== curWolf+1){
let n = [...availableNodes]
let removeItem = n.indexOf(nextNode)
n.splice(removeItem, 1);
queue.push({node:nextNode, curShip, curWolf:curWolf+1,availableNodes:n })
}
}else{
let n = [...availableNodes]
let removeItem = n.indexOf(nextNode)
n.splice(removeItem, 1);
queue.push({node:nextNode, curShip:curShip+1, curWolf, availableNodes:n })
}
}
}
return max
}