πŸ“Œ javascript κ°œλ… #10 μˆœμ—΄ / μˆ˜ν•™κΈ°λ³Έμ΄λ‘  (2)

doyeonleeΒ·2022λ…„ 3μ›” 28일
0

js / html / css

λͺ©λ‘ 보기
10/13
post-thumbnail

μˆ˜ν•™κΈ°λ³Έμ΄λ‘  / 경우의 수 / μˆœμ—΄

경우의 수

: μ–΄λ–€ 사건 λ˜λŠ” 일어날 수 μžˆλŠ” 경우의 κ°€μ§“μˆ˜λ₯Ό 숫자둜 ν‘œν˜„ν•˜λŠ” 것이며
μ£Όμ‚¬μœ„, 윷, κ°€μœ„λ°”μœ„λ³΄, 동전 λ“±μ—μ„œ 쓰인닀.
--> μ΄λŸ¬ν•œ 경우의 μˆ˜μ—λŠ” μˆœμ—΄, μ‘°ν•©, μ€‘λ³΅μˆœμ—΄ 등이 있으며, μ™„μ „ 탐색을 μ΄μš©ν•œλ‹€.

μ™„μ „ νƒμƒ‰μ΄λž€ ?

μ»΄ν“¨ν„°μ˜ λΉ λ₯Έ 계산 속도λ₯Ό 잘 μ΄μš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ κ°€λŠ₯ν•œ λͺ¨λ“  방법을 λ‚˜μ—΄ν•˜λ©° 닡을 μ°ΎλŠ” 방법이닀.


μˆœμ—΄ (permutation) : nPr

: μ„œλ‘œ λ‹€λ₯Έ n개의 μ›μ†Œ μ€‘μ—μ„œ r을 쀑볡 없이 골라 μˆœμ„œμ— 상관 있게 λ‚˜μ—΄ν•˜λŠ” 경우의 수
= forλ¬Έκ³Ό μž¬κ·€ν•¨μˆ˜λ‘œ ν‘œν˜„κ°€λŠ₯ν•˜λ‹€.
--> κ·ΈλŸ¬λ‚˜ for문은 λ½‘λŠ” 개수 만큼 λŠ˜μ–΄λ‚˜κΈ° λ•Œλ¬Έμ— 보톡은 μž¬κ·€ν•¨μˆ˜λ₯Ό μ“΄λ‹€.

μ˜ˆμ‹œμ‚¬μ§„

3개의 μ•ŒνŒŒλ²³μœΌλ‘œ 단어λ₯Ό λ§Œλ“œλŠ” 경우의 수3개의 μ•ŒνŒŒλ²³μœΌλ‘œ 단어λ₯Ό λ§Œλ“œλŠ” 경우의 수


μˆœμ—΄ 예제 μ½”λ“œ (1) for loop

// >> for문으둜 ꡬ성
let input = ["a","b","c"];
let count = 0;

function permutation(arr) {
  // i : 첫번째 μœ„μΉ˜ μ‹œν‚¬ μš”μ†Œ {i, o, o}
  // j : λ‘λ²ˆμ§Έ μœ„μΉ˜ μ‹œν‚¬ μš”μ†Œ {i, j, o}
  // -> ν˜Ήμ‹œλ‚˜ iλž‘ jκ°€ 같을 경우λ₯Ό continue μ΄μš©ν•˜μ—¬ μŠ€ν‚΅ 처리 ν•΄μ€€λ‹€.
  
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      if (i == j) continue;
      // k : μ„Έλ²ˆμ§Έ μœ„μΉ˜ μ‹œν‚¬ μš”μ†Œ {i, j, k}
      for (let k = 0; k < arr.length; k++) {
        // iλž‘ kκ°€ 같을 경우 μŠ€ν‚΅ 
        if (i == k) continue;
        // jλž‘ kκ°€ 같을 경우 μŠ€ν‚΅
        if (j == k) continue;

        console.log(arr[i], arr[j], arr[k]);
        count++;
      }
    }
  }
}

permutation(input);
console.log(count); // 6개의 경우의 μˆ˜κ°€ λ‚˜μ˜¨λ‹€.

/*
a b c
a c b
b a c
b c a
c a b
c b a
*/

for문으둜 κ΅¬ν˜„ν•œ μ½”λ“œμ΄λ©°, input에 λ‹΄κΈ΄ a, b, c 3개의 μ•ŒνŒŒλ²³μ„ μ΄μš©ν•˜μ—¬ λ§Œλ“€ 수 μžˆλŠ” λ‹¨μ–΄μ˜ 경우의 수λ₯Ό λ‚˜νƒ€λ‚΄ μ£Όμ–΄μ•Ό ν•œλ‹€.

μš°μ„  iλ₯Ό 첫번째 μœ„μΉ˜ μ‹œν‚¬ μš”μ†Œλ‘œ 정해두고, jλŠ” λ‘λ²ˆμ§Έ μœ„μΉ˜ μ‹œν‚¬ μš”μ†Œ, kλŠ” μ„Έλ²ˆμ§Έ μœ„μΉ˜ μ‹œν‚¬ μš”μ†Œλ‘œ μ •ν•΄λ‘”λ‹€.
μ—¬κΈ°μ„œ 3가지 κ²½μš°κ°€ λ°œμƒν•˜λŠ”λ°,

  1. i = j
    : i와 jκ°€ κ°™λ‹€λ©΄ 3개의 μ•ŒνŒŒλ²³μ„ λͺ¨λ‘ μ‚¬μš©ν•œ κ²°κ³Όκ°€ λ‚˜μ˜€μ§€ μ•ŠμœΌλ―€λ‘œ 이 경우λ₯Ό λ„˜κ²¨μ€˜μ•Ό ν•œλ‹€. λ”°λΌμ„œ, continueλ₯Ό μ΄μš©ν•΄μ„œ 이 λΆ€λΆ„λ§Œ λ¬΄μ‹œν•˜κ³  λŒλ €μ€€λ‹€.
  2. k = i
    : k와 iκ°€ 같은 경우 μ—­μ‹œ continue 이용
  3. k = j
    : k와 jκ°€ 같은 경우 μ—­μ‹œ continue 이용

μœ„μ˜ 세가지λ₯Ό κ³ λ €ν•˜μ—¬ if문을 μ΄μš©ν•˜μ—¬ μ½”λ“œλ₯Ό μ§œμ€€λ’€, count++λ₯Ό μ΄μš©ν•΄ μˆœμ„œλ₯Ό ν•˜λ‚˜μ”© λŠ˜λ €μ€€λ‹€. μ—¬κΈ°μ„œ countλŠ” index값을 의미

예) a 루프가 λ‹€ 돌면 -> b 루프가 λ‹€ 돌면 -> c 루프

for문을 쓰지 μ•ŠλŠ”λ‹€λŠ” 이유

= if문이 value 개수만큼 생성
κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 값이 λ§Žμ„ 수둝 λ³΅μž‘ν•΄μ§


μˆœμ—΄ 예제 μ½”λ“œ (2) μž¬κ·€ν•¨μˆ˜

// >> μž¬κ·€ ν•¨μˆ˜λ‘œ ꡬ성 
let Input = ["a", "b", "c"];
let Count = 0;

// μ£Όμ˜μ‚¬ν•­
// 1. μž¬κ·€ν•¨μˆ˜λ₯Ό λ©ˆμΆ°μ•Ό ν•  쑰건
// 2. μž¬κ·€λ₯Ό λŒλ©΄μ„œ λ³€κ²½λ˜μ–΄μ•Ό ν•  λΆ€λΆ„ / λ©”μΈλ‘œμ§
function permutation(arr, s, r) {
  // = r은 도착해야할 인덱슀
  // sκ°€ r에 λ„λ‹¬ν•˜λ©΄ Count 값을 증가 - μ½˜μ†”λ‘œ λ°°μ—΄ μƒνƒœ 확인
    
    if (s == r) {
    Count++;
    console.log(arr.join(" ")); // join λ©”μ„œλ“œ -> λ¬Έμžμ—΄λ‘œ λ³€ν™˜
    return;
  } 
  // 1. -> μž¬κ·€μ— λŒ€ν•œ break 역할을 ν•˜λŠ” λΆ€λΆ„
  
  
  // μ„ νƒλœκ²ƒμ„ 뽑지 μ•ŠμœΌλ €κ³  0 λŒ€μ‹  sλΆ€ν„°λ‘œ 지정
  for (let i = s; i < arr.length; i++) {
    [arr[s], arr[i]] = [arr[i], arr[s]]; // swap
    // 첫번째 μš”μ†ŒλŠ” 선택 ν–ˆμœΌλ‹ˆ λ‘λ²ˆμ§Έ μš”μ†Œλ₯Ό 선택 -> s + 1
    permutation(arr, s + 1, r);
    [arr[s], arr[i]] = [arr[i], arr[s]]; // swap 원상볡귀

    /*
    s = 0, r = 2  ["a", ]
    s = 1, r = 2  ["a", "b", ]
    s = 2, r = 2  ["a", "b", "c"]
    --> μœ„ forλ¬Έκ³Ό 좜λ ₯λ˜λŠ” 값은 동일함
    */

  } 
}

permutation(Input, 0, 2); // 0λ²ˆλΆ€ν„° 2λ²ˆκΉŒμ§€(3개) λ½‘λŠ”λ‹€.
console.log(Count);
profile
λŠλ €λ„ 천천히 κΌΌκΌΌν•˜κ²Œ !

0개의 λŒ“κΈ€