ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ํ์ด - ์์ ์ํธ / ์ ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ฐฐ์นํ๊ธฐ / ์ด์ํ ๋ฌธ์ ๋ง๋ค๊ธฐ / ์ต๋๊ณต์ฝ์์ ์ต์๊ณต๋ฐฐ์
์ด์ง ํธ๋ฆฌ / ๊ฒ์, ์ฝ์ , ์ญ์ / ์ ๋ ฌ๋ ๋ฐฐ์ด VS ์ด์ง ํธ๋ฆฌ
๐ ๋ด๊ฐ ์์ฑํ ํ์ด
function solution(s, n) {
const lower = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
const upper = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
const newArr = s.split('').map(item => {
// ๊ณต๋ฐฑ
if (item === ' ') {
return ' ';
}
if (lower.includes(item)) { // ์๋ฌธ์
const stringIndex = lower.indexOf(item) + n
if (stringIndex <= 25) {
return lower[stringIndex];
} else {
const newIndex = stringIndex % 25 - 1;
return lower[newIndex];
}
} else { // ๋๋ฌธ์
const stringIndex = upper.indexOf(item) + n
if (stringIndex <= 25) {
return upper[stringIndex];
} else {
const newIndex = stringIndex % 25 - 1;
return upper[newIndex];
}
}
});
return newArr.join('');
}
๐ ๋ค๋ฅธ ์ฌ๋์ ํ์ด 1
๋์ ๊ฐ์ ํ๋ฆ์ผ๋ก ํ์๋๋ฐ ํจ์ฌ ์งง๋ค. ์กฐ๊ฑด๋ถ ์ผํญ ์ฐ์ฐ์๋ฅผ ์ด์ฉํดtextArr ๋ณ์์ ๋จผ์ lower์ธ์ง upper์ธ์ง ํ๋จํด ๋ฐฐ์ด์ ํ ๋นํ ํ์ ํ ๋ฒ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๋๋ ๋ฌธ์ ๋ฅผ ๋ณธ ํ map()์ด ์๊ฐ๋์ ๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ๋ฐ๊ฟจ๋๋ฐ ๊ตณ์ด ๋ฐฐ์ด๋ก ๋ฐ๊ฟ ํ์๋ ์ ํ ์์๋ค.
function solution(s, n) {
var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var lower = "abcdefghijklmnopqrstuvwxyz";
var answer= '';
for(var i =0; i <s.length; i++){
var text = s[i];
if(text == ' ') {
answer += ' ';
continue;
}
var textArr = upper.includes(text) ? upper : lower;
var index = textArr.indexOf(text) + n;
if(index >= textArr.length) {
index -= textArr.length;
}
answer += textArr[index];
}
return answer;
}
๐ ๋ค๋ฅธ ์ฌ๋์ ํ์ด 2
function solution(s, n) {
const chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY "
return s.split('').map(e => chars[chars.indexOf(e)+n]).join('');
}
๐ ๋ด๊ฐ ์์ฑํ ํ์ด
function solution(n) {
const string = (n + '').split('').sort((a, b) => b - a).join('');
return parseInt(string);
// return +string;
}
๐ ๋ด๊ฐ ์์ฑํ ํ์ด
function solution(s) {
return s.split(' ').map(s => s.split('').map((s, i) => i % 2 === 0 ? s.toUpperCase() : s.toLowerCase()).join('')).join(' ');
}
๐ ๋ด๊ฐ ์์ฑํ ํ์ด
function solution(n, m) {
const limit = n < m ? m : n;
const common_factor = [];
for (let i = 1; i <= limit; i++) {
if (n % i === 0 && m % i === 0) {
common_factor.push(i);
}
}
const gcf = Math.max(...common_factor);
const lcm = gcf * (n / gcf) * (m / gcf);
return [gcf, lcm];
}
๐ ์ ๋ ฌ๋ ๋ฐฐ์ด : ๊ฒ์ ๋น ๋ฆ(์ด์ง ๊ฒ์) / ์ฝ์ , ์ญ์ ๋๋ฆผ
๐ ํด์ ํ ์ด๋ธ : ๊ฒ์, ์ฝ์ , ์ญ์ ๋น ๋ฆ / ์์ ์ ์ง ๋ถ๊ฐ๋ฅ
๐ ์ด์ง ํธ๋ฆฌ : ๊ฒ์, ์ฝ์ , ์ญ์ ๋น ๋ฆ / ์์ ์ ์ง ๊ฐ๋ฅ
๐ ํธ๋ฆฌ(Tree)
ํธ๋ฆฌ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋
ธ๋ ๊ธฐ๋ฐ ์๋ฃ ๊ตฌ์กฐ
์ด๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ๊ฐ ๋
ธ๋๋ ๋ค๋ฅธ ํ ๋
ธ๋๋ก์ ๋งํฌ๋ง ํฌํจํ๋ ๋ฐ๋ฉด,
ํธ๋ฆฌ์์ ๊ฐ ๋
ธ๋๋ ์ฌ๋ฌ ๋
ธ๋๋ก์ ๋งํฌ
๋ฅผ ํฌํจํ๋ค.
๊ฐ์ฅ ์์ ๋ ธ๋๋ฅผ '๋ฃจํธ'๋ผ๊ณ ๋ถ๋ฅธ๋ค.
'๋ถ๋ชจ' ๋ ธ๋๋ '์์' ๋ ธ๋๋ฅผ ๊ฐ์ง๋ค.
ํธ๋ฆฌ์๋ '๋ ๋ฒจ'์ด ์๋ค.
๐ ์ด์ง ํธ๋ฆฌ(Binary Tree)
๊ฐ ๋ ธ๋์ ์์์ 0 ~ 2๊ฐ์ด๋ค.
ํ ๋ ธ๋์ ์์์ด ๋์ด๋ฉด, ํ ์์์ ๋ถ๋ชจ๋ณด๋ค ์์ ๊ฐ์, ๋ค๋ฅธ ์์์ ๋ถ๋ชจ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค.
p.241
Python์ผ๋ก ๊ตฌํ๋ ์ฝ๋ โ JavaScript๋ก ๋ณํ
class TreeNode {
constructor(data, left_child = null, right_child = null) {
this.data = data;
this.left_child = left_child;
this.right_child = right_child;
}
}
// ์ผ์ชฝ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ๋
ธ๋๋ฅผ ๋ง๋ค๊ณ
const node_1 = new TreeNode(1);
const node_2 = new TreeNode(10);
// ์ด๋ฅผ ์ด์ฉํด ๋ฃจํธ(๊ฐ์ฅ ์์ ๋
ธ๋)๋ฅผ ๋ง๋ ๋ค
const root = new TreeNode(5, node_1, node_2);
console.log(root);
// TreeNode {data: 5, left_child: TreeNode, right_child: TreeNode}
๋ฃจํธ
๋ถํฐ ์์ํด์ผ ํ๋คpp.242 ~ 257
Python์ผ๋ก ๊ตฌํ๋ ์ฝ๋ โ JavaScript๋ก ๋ณํ
class TreeNode {
constructor(value, left_child = null, right_child = null) {
this.value = value;
this.left_child = left_child;
this.right_child = right_child;
}
}
// ํธ๋ฆฌ ๋
ธ๋ ์์ฑ
const node_1 = new TreeNode(1);
const node_2 = new TreeNode(10);
const root = new TreeNode(5, node_1, node_2);
console.log(root); // TreeNode {value: 5, left_child: TreeNode, right_child: TreeNode}
// ๊ฒ์ โ (์ฐพ๋ ๊ฐ์ด ์ด๋ค ๋
ธ๋์ ์๋์ง๋ฅผ ๊ฒ์)
function search(value, node) {
if (node === null || node.value === value) {
return node;
} else if (node.value < value) {
return search(value, node.right_child);
} else {
return search(value, node.left_child);
}
}
const search8 = search(8, root); // ํธ๋ฆฌ ๊ฒ์์ ๋ฐ๋์ '๋ฃจํธ'๋ถํฐ ์์ํด์ผ ํจ
console.log(search8); // null
// ์ฝ์
โ
function insert(value, node) {
if (node.value < value) { // ๋์ ๋น๊ต
if (node.right_child === null) { // ๋ ์ด์ ์์ ๋
ธ๋๊ฐ ์์ผ๋ฉด
node.right_child = new TreeNode(value); // ๊ทธ ์์น์ ์ ๋
ธ๋ ์ถ๊ฐ
} else {
insert(value, node.right_child); // ์์ ๋
ธ๋๊ฐ ์์ผ๋ฉด ๋ค์ ๋์ ๋น๊ต
}
} else if (node.value > value) { // ๋์ ๋น๊ต
if (node.left_child === null) { // ๋ ์ด์ ์์ ๋
ธ๋๊ฐ ์์ผ๋ฉด
node.left_child = new TreeNode(value); // ๊ทธ ์์น์ ์ ๋
ธ๋ ์ถ๊ฐ
} else {
insert(value, node.left_child); // ์์ ๋
ธ๋๊ฐ ์์ผ๋ฉด ๋ค์ ๋์ ๋น๊ต
}
}
}
const insert13 = insert(13, root);
console.log(root); // ๊ฐ์ด 10์ธ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋์ ๊ฐ์ด 13์ธ ๋
ธ๋๊ฐ ์ถ๊ฐ๋จ
// ๐ฅ '์' ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋๊ฐ? ์ด๋ป๊ฒ ์ด์ง ํธ๋ฆฌ์ ์๋ฏธ๋ฅผ ์ ํ์ ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํด์ผ ๊ฒ ๋ค๊ณ ์๊ฐํ ์ ์๋ ๊ฑธ๊น.
// ๐ฅ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํด ํธ์ถ ์คํ์ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค์ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐ๋ผ๊ฐ๋ฉด ์ดํด๊ฐ ๋๋ ๊ฒ๋ ๊ฐ์๋ฐ ์ฝ๋๋ง ๋ณด๋ฉด ๋ง๋งํ๋ค. ๊ฒฐ๊ตญ ์ดํด ์๋๋ค๋ ๋ป.
// ์ญ์ โ
function remove(valueToRemove, node) {
// ๊ธฐ์ ์กฐ๊ฑด
if (node === null) {
return null;
} else if (valueToRemove < node.value) {
node.left_child = remove(valueToRemove, node.left_child);
} else if (valueToRemove > node.value) {
node.right_child = remove(valueToRemove, node.right_child);
} else { // ํ์ฌ ๋
ธ๋๊ฐ ์ญ์ ํ๋ ค๋ ๋
ธ๋์ธ ๊ฒฝ์ฐ
if (node.left_child === null) {
return node.right_child;
} else if (node.right_child === null) {
return node.left_child;
} else { // ํ์ฌ ๋
ธ๋์ ์์ ๋
ธ๋๊ฐ ๋์ด๋ฉด
node.right_child = lift(node.right_child, node);
return node;
}
}
}
function lift(node, nodeToRemove) {
if (node.left_child) {
node.left_child = lift(node.left_child, nodeToRemove);
return node;
} else {
nodeToRemove.value = node.value;
return node.right_child;
}
}
const remove5 = remove(10, root);
console.log(root); // ๊ฐ์ด 10์ธ ๋
ธ๋๊ฐ ์ญ์ ๋๊ณ , ๊ฐ์ด 13์ธ ๋
ธ๋๊ฐ ๊ทธ ์๋ฆฌ์ ์์นํ๊ฒ ๋จ
๐โโ๏ธ Q1. ์ ์ฝ๋ ์ค ์ด์ง ํธ๋ฆฌ์ '์ญ์ ' ๋ถ๋ถ์ด ์ดํด๊ฐ ์๋๋ค.
๊ฒ์
๊ฐ ๋จ๊ณ๋ฅผ ์ํํ ๋๋ง๋ค ๋์ ๋น๊ต๋ฅผ ํตํด ๊ฐ์ด ๋ค์ด ์๋ ๊ณต๊ฐ ์ค ๋ฐ์ ์ ๊ฑฐํ๋ค.
๋ฐ๋ผ์, ์ด์ง ํธ๋ฆฌ ๊ฒ์์ ํจ์จ์ฑ
์ O(logN)
์ด๋ค.
+) ์ ๋ ฌ๋ ๋ฐฐ์ด ๊ฒ์(์ด์ง ๊ฒ์)์ ํจ์จ์ฑ์ธ O(logN)๊ณผ ๊ฐ๋ค.
์ฝ์
๋จผ์ , ์ ๋
ธ๋๊ฐ ๋ค์ด๊ฐ ์ฌ๋ฐ๋ฅธ ์์น๋ฅผ ์ฐพ์์ผ ํ๋ค.
๊ฐ ๋จ๊ณ๋ฅผ ์ํํ ๋๋ง๋ค ๋์ ๋น๊ต๋ฅผ ์งํํ๋ค.
์ด๋, ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌ์ ์ฝ์ ํ๋ฉด, ๋ถ๊ท ํ์ด ์ฌํ ํธ๋ฆฌ๊ฐ ๋๊ณ ํจ์จ์ฑ์ด ์ ์ข์ ํ๋ฅ ์ด ๋๋ค. โ ์ต์ ์ ์๋๋ฆฌ์ค O(N)
ex) 1 ~ 5๋ฅผ ์์๋๋ก (๊ณ์ ์ค๋ฅธ์ชฝ ๋ ธ๋์๋ง) ์ฝ์ ํ ํธ๋ฆฌ์์ 5๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด์๋ 5๋จ๊ณ ์ฆ, O(N)์ด ๊ฑธ๋ฆฐ๋ค.
๋ฐ๋ฉด,
๋ฌด์์
๋ก ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌ์ ์ฝ์ ํ๋ฉด, ๋๊ฐ ๊ท ํ ์กํ ํธ๋ฆฌ๊ฐ ๋๊ณ ํจ์จ์ฑ์ด ์ข์ ํ๋ฅ ์ด ๋๋ค. โ ํ๊ท ์๋๋ฆฌ์ค O(logN)ex) 3, 2, 4, 1, 5๋ฅผ ์์๋๋ก ์ฝ์ ํ ํธ๋ฆฌ์์ 5๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด์๋ 3๋จ๊ณ๊ฐ ๊ฑธ๋ฆด ๋ฟ์ด๋ค.
๋ ์ด์ ์์์ด ์๋ ๋
ธ๋๊ฐ ๋์ฌ ๋๊น์ง ๋์ ๋น๊ต๋ฅผ ๊ณ์ ์งํํ๋ค.
๋ ์ด์ ์์์ด ์๋ ๋
ธ๋ ์ฆ, ์ฌ๋ฐ๋ฅธ ์์น๋ฅผ ์ฐพ์์ผ๋ฉด, 1๋จ๊ณ์ ๊ฑธ์ณ ์ฝ์
์ ์งํํ๋ค. (๋น
์ค๋ ์์ ๋ฌด์)
๋ฐ๋ผ์, ํ๊ท ์ ์ธ ์๋๋ฆฌ์ค์์ ์ด์ง ํธ๋ฆฌ ์ฝ์
์ ํจ์จ์ฑ
์ O(logN)
์ด๋ค.
+) ์ ๋ ฌ๋ ๋ฐฐ์ด ์ฝ์ ์ ํจ์จ์ฑ์ธ O(N)์ ๋นํด ๋งค์ฐ ์ข๋ค.
๐ก ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ด์ง ํธ๋ฆฌ๋ก ๋ณํํ๊ณ ์ ํ ๋๋, ๋จผ์ ๋ฐ์ดํฐ ์์๋ฅผ
๋ฌด์์
๋ก ๋ง๋๋ ๊ฒ ์ข๋ค !
์ญ์
์ญ์ ํ ๋
ธ๋์ ์์์ด ์์ผ๋ฉด
, ๊ทธ๋ฅ ์ญ์ ํ๋ค
์ญ์ ํ ๋
ธ๋์ ์์์ด ํ๋๋ฉด
, ๋
ธ๋๋ฅผ ์ญ์ ํ๊ณ ๊ทธ ์์์ ์ญ์ ๋ ๋
ธ๋๊ฐ ์๋ ์์น์ ๋ฃ๋๋ค.
์ญ์ ํ ๋
ธ๋์ ์์์ด ๋์ด๋ฉด
, ์ญ์ ๋ ๋
ธ๋๋ฅผ ํ์์ ๋
ธ๋๋ก ๋์ฒดํ๋ค.
ํ์์ ๋
ธ๋๋ ์ญ์ ๋ ๋
ธ๋๋ณด๋ค ํฐ ๊ฐ ์ค ์ต์๊ฐ์ ๊ฐ๋ ์์ ๋
ธ๋๋ค.
๋จ, ํ์์ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์์ด ์์ผ๋ฉด, ํ์์๋ฅผ ์ญ์ ๋ ๋ ธ๋๊ฐ ์๋ ์๋ฆฌ์ ๋ฃ์ ํ, ํ์์ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ์์์ ํ์์ ๋ ธ๋์ ์๋ ๋ถ๋ชจ์ ์ผ์ชฝ ์์์ผ๋ก ๋ฃ๋๋ค.
์ด์ง ํธ๋ฆฌ ์ญ์ ์ ํจ์จ์ฑ
์ O(logN)
์ด๋ค.
+) ์ ๋ ฌ๋ ๋ฐฐ์ด ์ญ์ ์ ํจ์จ์ฑ์ธ O(N)์ ๋นํด ๋งค์ฐ ์ข๋ค.
์ฐ์ฐ | ๋ฐฐ์ด | ์ฐ๊ฒฐ ๋ฆฌ์คํธ |
---|---|---|
์ฝ๊ธฐ | O(1) | O(N) |
๊ฒ์ | O(N) | O(N) |
์ฝ์ | O(N)(๋์์ ํ๋ฉด O(1)) | O(N)(์์์ ํ๋ฉด O(1)) |
์ญ์ | O(N)(๋์์ ํ๋ฉด O(1)) | O(N)(์์์ ํ๋ฉด O(1)) |
์ฐ์ฐ | ์ ๋ ฌ๋ ๋ฐฐ์ด | ์ด์ง ํธ๋ฆฌ |
---|---|---|
์ฝ๊ธฐ | O(1) | O(N) |
๊ฒ์ | O(logN) | O(logN) |
์ฝ์ | O(N) | O(logN) (์ ๋ ฌ๋ ๋ฐ์ดํฐ ์ฝ์ ์ O(N)) |
์ญ์ | O(N) | O(logN) |
์๋ฃ ๊ตฌ์กฐ ์ํ๋ ์๋ฃ ๊ตฌ์กฐ์์ ๋ชจ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ
ํ๋ ๊ณผ์ ์ ๋งํ๋ค.
ํธ๋ฆฌ ์ํ์ ํจ์จ์ฑ์ O(N)์ด๋ค.
[ ์์ ]
'์ฑ
์ ๋ชฉ ๋ฆฌ์คํธ๋ฅผ ๊ด๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์
'์ ์์ฑํ๋ค๊ณ ํ์
๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋ค
โ ๋ฆฌ์คํธ๊ฐ ์์ฃผ ๋ฐ๋์ง ์๋๋ค๋ฉด, ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ด์ฉํ๋ ๊ฒ์ด ์ข๋ค (์ฝ์ , ์ญ์ ๊ฐ ์์ฃผ ์ ์ผ์ด๋จ, ๊ฒ์์ ๋น ๋ฆ)
โ ๊ทธ๋ฌ๋, ๋ฆฌ์คํธ๊ฐ ์์๋ก ๋ฐ๋๋ค๋ฉด, ์ด์ง ํธ๋ฆฌ
๋ฅผ ์ด์ฉํด์ผ ํ๋ค (์ฝ์
, ์ญ์ ๊ฐ ์์ฃผ ์ผ์ด๋จ)
โ 2๋ฒ๊ณผ 3๋ฒ ๊ธฐ๋ฅ์ ์์ ๋ฐฐ์ด ์ด์ง ํธ๋ฆฌ์ ๊ฒ์, ์ฝ์ , ์ญ์ ์ฝ๋๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
โ 1๋ฒ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด์๋ ์ด์ง ํธ๋ฆฌ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํด์ผ ํ๋ค. ์ด ๊ฒฝ์ฐ์๋ ์ค์ ์ํ๋ฅผ ์ด์ฉํ๋ค.
pp.259
Python์ผ๋ก ๊ตฌํ๋ ์ฝ๋ โ JavaScript๋ก ๋ณํ
๐โโ๏ธ Q2. ์ฝ๋๋ ๋งค์ฐ ๊ฐ๋จํ์ง๋ง ์ด๊ฒ ์ญ์ ์ดํด๊ฐ ์ ๊ฐ๋ค. ๋ํ, ์ด์ง ํธ๋ฆฌ ์ํ ์ค์์ ์ด ์ฑ ์์ ๋ค๋ฃฌ ๊ฒ์ ์ค์ ์ํ ํ๋์ด๋ค. ์ผ๋จ ์ด์ง ํธ๋ฆฌ ์ญ์ ์ฝ๋๋ถํฐ ์ดํดํ ํ ์ด์ง ํธ๋ฆฌ ์ํ์ ๋ํด์๋ ์ถ๊ฐ๋ก ๋ ๊ณต๋ถํ ๊ฒ!
// ์ค์ ์ํ โ (์ผ์ชฝ )
function traverse_and_print(node) {
if (node === null) {
return;
}
traverse_and_print(node.left_child);
console.log(node.value);
traverse_and_print(node.right_child);
}
ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ํ์ด
์ฑ ๊ณ์ ์ฝ๊ธฐ