[TIL] 211024

Lee SyongΒ·2021λ…„ 10μ›” 24일
0

TIL

λͺ©λ‘ 보기
67/204
post-thumbnail

πŸ“ 였늘 ν•œ 것

  1. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 문제 풀이 - μ‹œμ € μ•”ν˜Έ / μ •μˆ˜ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ λ°°μΉ˜ν•˜κΈ° / μ΄μƒν•œ 문자 λ§Œλ“€κΈ° / μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜

  2. 이진 트리 / 검색, μ‚½μž…, μ‚­μ œ / μ •λ ¬λœ λ°°μ—΄ VS 이진 트리


πŸ“– ν•™μŠ΅ 자료

  1. μ±… 'λˆ„κ΅¬λ‚˜ 자료 ꡬ쑰와 μ•Œκ³ λ¦¬μ¦˜'

πŸ“š 배운 것

1. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 문제 풀이

1) Level 1 문제

(1) μ‹œμ € μ•”ν˜Έ

πŸ”Ž λ‚΄κ°€ μž‘μ„±ν•œ 풀이

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

  • n이 1 ~ 25인 점을 μ΄μš©ν•œ 풀이닀. ν•œ λ²ˆμ— μ†Œλ¬Έμž, λŒ€λ¬Έμžλ₯Ό 두 λ²ˆμ”© 써쀬닀. (두 번째 μ“Έ λ•Œ λ§ˆμ§€λ§‰ zλŠ” ꡳ이 μ•ˆ 썼음)
function solution(s, n) {
  const chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY                          "
  return s.split('').map(e => chars[chars.indexOf(e)+n]).join('');
}

(2) μ •μˆ˜ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ λ°°μΉ˜ν•˜κΈ°

πŸ”Ž λ‚΄κ°€ μž‘μ„±ν•œ 풀이

  • parseInt(string) λŒ€μ‹ μ— +string이라고 μž‘μ„±ν•΄λ„ λœλ‹€. λ¬Έμžμ—΄μ— + / - κΈ°ν˜Έκ°€ λΆ™μœΌλ©΄ λ¬Έμžμ—΄μ΄ 숫자둜 바뀐닀.
function solution(n) {
  const string = (n + '').split('').sort((a, b) => b - a).join('');
  return parseInt(string);
  // return +string;
}

(3) μ΄μƒν•œ 문자 λ§Œλ“€κΈ°

πŸ”Ž λ‚΄κ°€ μž‘μ„±ν•œ 풀이

  • λ¨Όμ €, 주어진 λ¬Έμžμ—΄μ„ split()λ₯Ό μ΄μš©ν•΄ λ°°μ—΄λ‘œ λ°”κΏ”μ£Όμ—ˆλ‹€. κ·Έ ν›„, map()을 μ΄μš©ν•΄ κ·Έ λ°°μ—΄μ˜ μš”μ†Œ ν•˜λ‚˜ν•˜λ‚˜λ₯Ό λ‹€μ‹œ ν•˜μœ„ λ°°μ—΄λ‘œ λ°”κΏ”μ€€ ν›„ 또 λ‹€μ‹œ map()을 μ΄μš©ν•΄ κ·Έ ν•˜μœ„ λ°°μ—΄μ˜ μš”μ†Œ ν•˜λ‚˜ν•˜λ‚˜λ₯Ό 쑰건에 맞게 λ°”κΏ”μ£Όμ—ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, ν•˜μœ„ 배열을 join()을 μ΄μš©ν•΄ λ¬Έμžμ—΄λ‘œ λ§Œλ“€μ–΄μ€€ ν›„ 또 λ‹€μ‹œ join()을 μ΄μš©ν•΄ μƒμœ„ 배열을 λ¬Έμžμ—΄λ‘œ λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€.
function solution(s) {
  return s.split(' ').map(s => s.split('').map((s, i) => i % 2 === 0 ? s.toUpperCase() : s.toLowerCase()).join('')).join(' ');
}

(4) μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜

πŸ”Ž λ‚΄κ°€ μž‘μ„±ν•œ 풀이

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];
}

12μž₯. 이진 트리둜 속도 ν–₯상

πŸ“Œ μ •λ ¬λœ λ°°μ—΄ : 검색 빠름(이진 검색) / μ‚½μž…, μ‚­μ œ 느림

πŸ“Œ ν•΄μ‹œ ν…Œμ΄λΈ” : 검색, μ‚½μž…, μ‚­μ œ 빠름 / μˆœμ„œ μœ μ§€ λΆˆκ°€λŠ₯

πŸ“Œ 이진 트리 : 검색, μ‚½μž…, μ‚­μ œ 빠름 / μˆœμ„œ μœ μ§€ κ°€λŠ₯

1) 이진 트리(Binary Tree)

(1) μ„€λͺ…

πŸ”Ž 트리(Tree)

  • νŠΈλ¦¬λŠ” μ—°κ²° λ¦¬μŠ€νŠΈμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ…Έλ“œ 기반 자료 ꡬ쑰이닀.

  • μ—°κ²° λ¦¬μŠ€νŠΈμ—μ„œ 각 λ…Έλ“œλŠ” λ‹€λ₯Έ ν•œ λ…Έλ“œλ‘œμ˜ 링크만 ν¬ν•¨ν•˜λŠ” 반면,
    νŠΈλ¦¬μ—μ„œ 각 λ…Έλ“œλŠ” μ—¬λŸ¬ λ…Έλ“œλ‘œμ˜ 링크λ₯Ό ν¬ν•¨ν•œλ‹€.

  • κ°€μž₯ μƒμœ„ λ…Έλ“œλ₯Ό '루트'라고 λΆ€λ₯Έλ‹€.

  • 'λΆ€λͺ¨' λ…Έλ“œλŠ” 'μžμ‹' λ…Έλ“œλ₯Ό 가진닀.

  • νŠΈλ¦¬μ—λŠ” '레벨'이 μžˆλ‹€.

πŸ”Ž 이진 트리(Binary Tree)

  • 각 λ…Έλ“œμ˜ μžμ‹μ€ 0 ~ 2κ°œμ΄λ‹€.

  • ν•œ λ…Έλ“œμ˜ μžμ‹μ΄ λ‘˜μ΄λ©΄, ν•œ μžμ‹μ€ λΆ€λͺ¨λ³΄λ‹€ μž‘μ€ 값을, λ‹€λ₯Έ μžμ‹μ€ λΆ€λͺ¨λ³΄λ‹€ 큰 값을 κ°€μ Έμ•Ό ν•œλ‹€.

(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}

(3) 이진 트리의 μ—°μ‚°

  • 트리 검색은, λ°˜λ“œμ‹œ λ£¨νŠΈλΆ€ν„° μ‹œμž‘ν•΄μ•Ό ν•œλ‹€

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. μœ„ μ½”λ“œ 쀑 이진 트리의 'μ‚­μ œ' 뢀뢄이 이해가 μ•ˆλœλ‹€.

(4) λΉ… 였

  1. 검색

    각 단계λ₯Ό μˆ˜ν–‰ν•  λ•Œλ§ˆλ‹€ λŒ€μ†Œ 비ꡐλ₯Ό 톡해 값이 λ“€μ–΄ μžˆλŠ” 곡간 쀑 λ°˜μ„ μ œκ±°ν•œλ‹€.
    λ”°λΌμ„œ, 이진 트리 κ²€μƒ‰μ˜ νš¨μœ¨μ„±μ€ O(logN)이닀.

    +) μ •λ ¬λœ λ°°μ—΄ 검색(이진 검색)의 νš¨μœ¨μ„±μΈ O(logN)κ³Ό κ°™λ‹€.

  2. μ‚½μž…

    λ¨Όμ €, μƒˆ λ…Έλ“œκ°€ λ“€μ–΄κ°ˆ μ˜¬λ°”λ₯Έ μœ„μΉ˜λ₯Ό μ°Ύμ•„μ•Ό ν•œλ‹€.
    각 단계λ₯Ό μˆ˜ν–‰ν•  λ•Œλ§ˆλ‹€ λŒ€μ†Œ 비ꡐλ₯Ό μ§„ν–‰ν•œλ‹€.

    μ΄λ•Œ, μ •λ ¬λœ 데이터λ₯Ό νŠΈλ¦¬μ— μ‚½μž…ν•˜λ©΄, λΆˆκ· ν˜•μ΄ μ‹¬ν•œ νŠΈλ¦¬κ°€ 되고 νš¨μœ¨μ„±μ΄ μ•ˆ 쒋을 ν™•λ₯ μ΄ λ†’λ‹€. β†’ μ΅œμ•…μ˜ μ‹œλ‚˜λ¦¬μ˜€ O(N)

    ex) 1 ~ 5λ₯Ό μˆœμ„œλŒ€λ‘œ (계속 였λ₯Έμͺ½ λ…Έλ“œμ—λ§Œ) μ‚½μž…ν•œ νŠΈλ¦¬μ—μ„œ 5λ₯Ό κ²€μƒ‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” 5단계 즉, O(N)이 κ±Έλ¦°λ‹€.

    반면, λ¬΄μž‘μœ„λ‘œ μ •λ ¬λœ 데이터λ₯Ό νŠΈλ¦¬μ— μ‚½μž…ν•˜λ©΄, λŒ€κ°œ κ· ν˜• 작힌 νŠΈλ¦¬κ°€ 되고 νš¨μœ¨μ„±μ΄ 쒋을 ν™•λ₯ μ΄ λ†’λ‹€. β†’ 평균 μ‹œλ‚˜λ¦¬μ˜€ O(logN)

    ex) 3, 2, 4, 1, 5λ₯Ό μˆœμ„œλŒ€λ‘œ μ‚½μž…ν•œ νŠΈλ¦¬μ—μ„œ 5λ₯Ό κ²€μƒ‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” 3단계가 걸릴 뿐이닀.

    더 이상 μžμ‹μ΄ μ—†λŠ” λ…Έλ“œκ°€ λ‚˜μ˜¬ λ•ŒκΉŒμ§€ λŒ€μ†Œ 비ꡐλ₯Ό 계속 μ§„ν–‰ν•œλ‹€.
    더 이상 μžμ‹μ΄ μ—†λŠ λ…Έλ“œ 즉, μ˜¬λ°”λ₯Έ μœ„μΉ˜λ₯Ό μ°Ύμ•˜μœΌλ©΄, 1단계에 걸쳐 μ‚½μž…μ„ μ§„ν–‰ν•œλ‹€. (λΉ…μ˜€λŠ” μƒμˆ˜ λ¬΄μ‹œ)

    λ”°λΌμ„œ, 평균적인 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ 이진 트리 μ‚½μž…μ˜ νš¨μœ¨μ„±μ€ O(logN)이닀.

    +) μ •λ ¬λœ λ°°μ—΄ μ‚½μž…μ˜ νš¨μœ¨μ„±μΈ O(N)에 λΉ„ν•΄ 맀우 μ’‹λ‹€.

    πŸ’‘ μ •λ ¬λœ 배열을 이진 트리둜 λ³€ν™˜ν•˜κ³ μž ν•  λ•ŒλŠ”, λ¨Όμ € 데이터 μˆœμ„œλ₯Ό λ¬΄μž‘μœ„λ‘œ λ§Œλ“œλŠ” 게 μ’‹λ‹€ !

  3. μ‚­μ œ

    μ‚­μ œν•  λ…Έλ“œμ— μžμ‹μ΄ μ—†μœΌλ©΄, κ·Έλƒ₯ μ‚­μ œν•œλ‹€

    μ‚­μ œν•  λ…Έλ“œμ— μžμ‹μ΄ ν•˜λ‚˜λ©΄, λ…Έλ“œλ₯Ό μ‚­μ œν•˜κ³  κ·Έ μžμ‹μ„ μ‚­μ œλœ λ…Έλ“œκ°€ 있던 μœ„μΉ˜μ— λ„£λŠ”λ‹€.

    μ‚­μ œν•  λ…Έλ“œμ— μžμ‹μ΄ λ‘˜μ΄λ©΄, μ‚­μ œλœ λ…Έλ“œλ₯Ό ν›„μ†μž λ…Έλ“œλ‘œ λŒ€μ²΄ν•œλ‹€.
    ν›„μ†μž λ…Έλ“œλž€ μ‚­μ œλœ λ…Έλ“œλ³΄λ‹€ 큰 κ°’ 쀑 μ΅œμ†Ÿκ°’μ„ κ°–λŠ” μžμ‹ λ…Έλ“œλ‹€.

    단, ν›„μ†μž λ…Έλ“œμ— 였λ₯Έμͺ½ μžμ‹μ΄ 있으면, ν›„μ†μžλ₯Ό μ‚­μ œλœ λ…Έλ“œκ°€ 있던 μžλ¦¬μ— 넣은 ν›„, ν›„μ†μž λ…Έλ“œμ˜ 였λ₯Έμͺ½ μžμ‹μ„ ν›„μ†μž λ…Έλ“œμ˜ μ›λž˜ λΆ€λͺ¨μ˜ μ™Όμͺ½ μžμ‹μœΌλ‘œ λ„£λŠ”λ‹€.

    이진 트리 μ‚­μ œμ˜ νš¨μœ¨μ„±μ€ O(logN)이닀.

    +) μ •λ ¬λœ λ°°μ—΄ μ‚­μ œμ˜ νš¨μœ¨μ„±μΈ O(N)에 λΉ„ν•΄ 맀우 μ’‹λ‹€.

(5) νš¨μœ¨μ„± 비ꡐ

- λ°°μ—΄ VS μ—°κ²° 리슀트

μ—°μ‚°λ°°μ—΄μ—°κ²° 리슀트
읽기O(1)O(N)
검색O(N)O(N)
μ‚½μž…O(N)(λμ—μ„œ ν•˜λ©΄ O(1))O(N)(μ•žμ—μ„œ ν•˜λ©΄ O(1))
μ‚­μ œO(N)(λμ—μ„œ ν•˜λ©΄ O(1))O(N)(μ•žμ—μ„œ ν•˜λ©΄ O(1))

- μ •λ ¬λœ λ°°μ—΄ VS 이진 트리

μ—°μ‚°μ •λ ¬λœ 배열이진 트리
읽기O(1)O(N)
검색O(logN)O(logN)
μ‚½μž…O(N)O(logN) (μ •λ ¬λœ 데이터 μ‚½μž… μ‹œ O(N))
μ‚­μ œO(N)O(logN)

(6) 이진 트리의 순회

자료 ꡬ쑰 μˆœνšŒλž€ 자료 κ΅¬μ‘°μ—μ„œ λͺ¨λ“  λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜λŠ” 과정을 λ§ν•œλ‹€.
트리 순회의 νš¨μœ¨μ„±μ€ O(N)이닀.

[ 예제 ]

'μ±… 제λͺ© 리슀트λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜'을 μƒμ„±ν•œλ‹€κ³  ν•˜μž
λ‹€μŒκ³Ό 같은 κΈ°λŠ₯을 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€

  1. ν”„λ‘œκ·Έλž¨μ΄ μ±… 제λͺ©μ„ μ•ŒνŒŒλ²³ 순으둜 좜λ ₯ν•  수 μžˆμ–΄μ•Ό 함
  2. ν”„λ‘œκ·Έλž¨μ΄ 리슀트λ₯Ό κ³„μ†ν•΄μ„œ λ°”κΏ€ 수 μžˆμ–΄μ•Ό 함
  3. μ‚¬μš©μžκ°€ λ¦¬μŠ€νŠΈμ—μ„œ μ±… 제λͺ©μ„ 검색할 수 μžˆμ–΄μ•Ό 함

β†’ λ¦¬μŠ€νŠΈκ°€ 자주 λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€λ©΄, μ •λ ¬λœ 배열을 μ΄μš©ν•˜λŠ” 것이 μ’‹λ‹€ (μ‚½μž…, μ‚­μ œκ°€ 자주 μ•ˆ 일어남, 검색은 빠름)

β†’ κ·ΈλŸ¬λ‚˜, λ¦¬μŠ€νŠΈκ°€ μˆ˜μ‹œλ‘œ 바뀐닀면, 이진 트리λ₯Ό μ΄μš©ν•΄μ•Ό ν•œλ‹€ (μ‚½μž…, μ‚­μ œκ°€ 자주 일어남)

β†’ 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);
}

πŸ™‹β€β™€οΈ 질문

  1. μ—¬κΈ° λ°”λ‘œκ°€κΈ° (이진 트리 μ‚­μ œ)

  2. μ—¬κΈ° λ°”λ‘œκ°€κΈ° (이진 트리 μ€‘μœ„ 순회)


✨ 내일 ν•  것

  1. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 문제 풀이

  2. μ±… 계속 읽기

profile
λŠ₯λ™μ μœΌλ‘œ μ‚΄μž, ν–‰λ³΅ν•˜κ²ŒπŸ˜

0개의 λŒ“κΈ€