Algorithm/μΈν”„λŸ°(inflearn)

[JavaScript/section 7] 01 - 선택 μ •λ ¬

_μ„±ν˜Έ_ 2022. 9. 29. 14:27
728x90
λ°˜μ‘ν˜•

πŸ“Œ 문제

N개의 μˆ«μžκ°€ μž…λ ₯되면 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ 좜λ ₯ν•˜λŠ” λ¬Έμ œμ΄λ‹€. μ •λ ¬ν•˜λŠ” 방법은 선택 정렬이닀.

 

🧐 선택 μ •λ ¬μ΄λž€ λ¬΄μ—‡μΌκΉŒ?

  • 제자리 μ •λ ¬(in-place sorting) μ•Œκ³ λ¦¬μ¦˜μ˜ ν•˜λ‚˜
    • μž…λ ₯ λ°°μ—΄(μ •λ ¬λ˜μ§€ μ•Šμ€ κ°’λ“€) 이외에 λ‹€λ₯Έ μΆ”κ°€ λ©”λͺ¨λ¦¬λ₯Ό μš”κ΅¬ν•˜μ§€ μ•ŠλŠ” μ •λ ¬ 방법
  • ν•΄λ‹Ή μˆœμ„œμ— μ›μ†Œλ₯Ό 넣을 μœ„μΉ˜λŠ” 이미 μ •ν•΄μ Έ 있고, μ–΄λ–€ μ›μ†Œλ₯Ό 넣을지 μ„ νƒν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜
    • 첫 번째 μˆœμ„œμ—λŠ” 첫 번째 μœ„μΉ˜μ— κ°€μž₯ μ΅œμ†Ÿκ°’μ„ λ„£λŠ”λ‹€.
    • 두 번째 μˆœμ„œμ—λŠ” 두 번째 μœ„μΉ˜μ— 남은 κ°’ μ€‘μ—μ„œμ˜ μ΅œμ†Ÿκ°’μ„ λ„£λŠ”λ‹€.
    • ... μ΄ν•˜ μƒλž΅
  • κ³Όμ • μ„€λͺ…
    1. μ£Όμ–΄μ§„ λ°°μ—΄ μ€‘μ—μ„œ μ΅œμ†Ÿκ°’μ„ μ°ΎλŠ”λ‹€.
    2. ν•΄λ‹Ή 값을 맨 μ²˜μŒμ— μœ„μΉ˜ν•œ κ°’κ³Ό κ΅μ²΄ν•œλ‹€.
    3. 맨 처음 μœ„μΉ˜λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μš”μ†Œλ“€μ„ 같은 λ°©λ²•μœΌλ‘œ κ΅μ²΄ν•œλ‹€.
    4. (λ°°μ—΄μ˜ 길이 - 1) 만큼 μœ„μ˜ 1 ~ 3 과정을 λ°˜λ³΅ν•œλ‹€.

 

πŸ“ 풀이

πŸ§‘πŸ»‍πŸ’» λ‚˜μ˜ 풀이 방법

function solution(arr) {
  let answer = arr;

  for (let i = 0; i < arr.length - 1; i++) {
    // iλŠ” ν˜„μž¬ 정렬을 ν™•μ •ν•˜κ³ μž ν•˜λŠ” μœ„μΉ˜(인덱슀)
    let min = arr[i];
    let index = i;

    // ν™•μ •λœ 정렬을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μš”μ†Œλ“€ μ€‘μ—μ„œ μ΅œμ†Ÿκ°’μ„ μ°ΎλŠ” κ³Όμ •
    for (let j = i + 1; j < arr.length; j++) {
      if (min > arr[j]) {
        min = arr[j];
        index = j;
      }
    }

    // μ΅œμ†Ÿκ°’μ„ 찾은 ν›„ ν•΄λ‹Ή 값을 temp λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄ κ΅μ²΄ν•˜κ³  정렬을 ν™•μ •ν•œλ‹€.
    let temp = arr[i];
    arr[i] = arr[index];
    arr[index] = temp;
  }

  return answer;
}

let arr = [13, 5, 11, 7, 23, 15];
console.log(solution(arr));

 

πŸ‘¨πŸΌ‍🏫 κ°•μ‚¬λ‹˜ 풀이 방법

λ‚˜μ˜ 풀이 방법과 μœ μ‚¬ν•˜μ§€λ§Œ, λ°°μ—΄μ˜ μš”μ†Œλ₯Ό κ΅μ²΄ν•˜λŠ” λ°©λ²•μœΌλ‘œ κ΅¬μ‘° λΆ„ν•΄ ν• λ‹Ή ꡬ문을 μ‚¬μš©ν•œλ‹€.

ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή ꡬ문은 λ°°μ—΄μ΄λ‚˜ 객체의 속성을 ν•΄μ²΄ν•˜μ—¬ κ·Έ 값을 κ°œλ³„ λ³€μˆ˜μ— 담을 수 있게 ν•˜λŠ” JavaScript의 ν‘œν˜„μ‹μ΄λ‹€.

[arr[i], arr[idx]] = [arr[idx], arr[i]];

 

// κ°•μ‚¬λ‹˜ 풀이 방법
function solution(arr) {
  let answer = arr;

  for (let i = 0; i < arr.length - 1; i++) {
    let idx = i;
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[j] < arr[idx]) idx = j;
    }
    [arr[i], arr[idx]] = [arr[idx], arr[i]];
  }

  return answer;
}

let arr = [13, 5, 11, 7, 23, 15];
console.log(solution(arr));

 

πŸ™‡πŸ» μ°Έκ³ ν•œ μ‚¬μ΄νŠΈ

 

[μ•Œκ³ λ¦¬μ¦˜] 선택 μ •λ ¬(selection sort)μ΄λž€ - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io