πŸ”΅ brute force - μˆœμ—΄ μ‚¬μš©ν•˜κΈ°

sery270Β·2021λ…„ 2μ›” 14일
1

Algorithm

λͺ©λ‘ 보기
2/5

μ•ˆλ…•ν•˜μ„Έμš” :) μ˜€λŠ˜μ€ μˆœμ—΄μ„ μ‚¬μš©ν•˜λŠ” BF μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. μ€„μ„œλŠ” 방법, νŠΉμ • μž‘μ—… μˆœμ„œμ˜ λͺ¨λ“  경우의 수 λ“±, μˆœμ„œκ°€ μ€‘μš”ν•œ μž‘μ—…μ— μžˆμ–΄ BF + μˆœμ—΄μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. 그럼 μ˜€λŠ˜λ„ ν™”μ΄νŒ… μž…λ‹ˆλ‹€πŸŒΏ

μˆœμ—΄μ΄λž€ ?

  • μˆœμ—΄μ΄λž€ 1~NκΉŒμ§€ 이루어진 μˆ˜μ—΄μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
  • λ”°λΌμ„œ, 크기가 N인 μˆœμ—΄μ€ 총 N!개 μ‘΄μž¬ν•˜κ²Œ λ©λ‹ˆλ‹€.
  • μ–΄λ–€ μˆ˜μ—΄μ˜ λ‹€μŒ μˆ˜μ—΄μ„ μ•Œμ•„λ‚΄λŠ” μ—°μ‚°μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N)이 λ©λ‹ˆλ‹€.
  • BFμ—μ„œ μˆœμ—΄μ€ μˆœμ„œκ°€ μ€‘μš”ν•  λ•Œ, μ‚¬μš©λ˜κ³€ ν•©λ‹ˆλ‹€. (ex. 과일을 λ¨ΉλŠ” μˆœμ„œ )

λ‹€μŒ μˆœμ—΄ μ°ΎκΈ° μ•Œκ³ λ¦¬μ¦˜ μ‹œκ°„ λ³΅μž‘λ„

  1. A[0] ~ A[N-1] μ—μ„œ, A[i-1] > A[i] 을 λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ” 지점 μ°ΎκΈ° -> 쑰건이 λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ” 지점 A[i-1]

    πŸ•– μ΅œλŒ€ N 번 μ‹€ν–‰λ˜λ―€λ‘œ, O(N)

  2. A[i] ~ A[N-1] μ—μ„œ, κ°€μž₯ κΈ΄ κ°μ†Œν•˜λŠ” μˆ˜μ—΄ μ°ΎκΈ° -> A[i] ~ A[i+?] == B[0] ~ B[?+1]

    πŸ•– μ΅œλŒ€ N 번 μ‹€ν–‰λ˜λ―€λ‘œ, O(N)

  3. A[i] ~ A[N-1] μ‚¬μ΄μ—μ„œ, A[i-1] 보닀 값이 크며, κ°€μž₯ μž‘μ€ 수 μ°ΎκΈ° -> A[j]

  4. A[i-1] κ³Ό A[j]λ₯Ό swap !

    πŸ•– μ΅œλŒ€ ν•œλ²ˆ μ‹€ν–‰λ˜λ―€λ‘œ, O(1)

  5. A[i-1] ~ A[N-1] λ₯Ό μ˜€λ¦„μ°¨μˆœ μ •λ ¬

    πŸ•– O(N)

λ”°λΌμ„œ, O(3N + 1) μ΄λ―€λ‘œ, νŠΉμ • μˆœμ—΄μ˜ λ‹€μŒ μˆœμ—΄μ„ μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜μ€ O(N)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

(C++ STL next_permutation, prev_permutation)

bool next_permutation(vector<int> &a, int n) {
    int i = n-1;
    while (i > 0 && a[i-1] >= a[i]) {
        i -= 1;
    }
    if (i <= 0) {
        return false; // λ§ˆμ§€λ§‰ μˆœμ—΄μ΄λ©΄ false
    }
    int j = n-1;
    while (a[j] <= a[i-1]) {
        j -= 1;
    }
    swap(a[i-1], a[j]);
    j = n-1;
    while (i < j) {
        swap(a[i], a[j]);
        i += 1;
        j -= 1;
    }
    return true; // λ‹€μŒ μˆœμ—΄μ΄ μžˆλ‹€λ©΄ true
}

이전 μˆœμ—΄ μ°ΎκΈ° μ•Œκ³ λ¦¬μ¦˜ μ‹œκ°„ λ³΅μž‘λ„

λ‹€μŒ μˆœμ—΄ μ°ΎκΈ° μ•Œκ³ λ¦¬μ¦˜κ³Ό 쑰건(λΆ€λ“±ν˜Έμ˜ λ°©ν–₯)만 λ‹€λ₯΄λ―€λ‘œ, O(N)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

λͺ¨λ“  μˆœμ—΄ μ°ΎκΈ° μ•Œκ³ λ¦¬μ¦˜ μ‹œκ°„ λ³΅μž‘λ„

  • N μˆœμ—΄μ— λŒ€ν•œ 경우의 μˆ˜λŠ” N!가지, νŠΉμ • μˆœμ—΄μ— λŒ€ν•œ λ‹€μŒ μˆœμ—΄μ„ μ°ΎλŠ” μ—°μ‚°μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N)μ΄λ―€λ‘œ, λͺ¨λ“  μˆœμ—΄ μ°ΎκΈ° μ•Œκ³ λ¦¬μ¦˜μ€ O(N!) * O(N)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.
  • N이 10 μ΄ν•˜μ΄λ©΄, 1μ΄ˆμ•ˆμ— BF둜 ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
profile
κ°œλ°œμ„Έλ¦¬μ˜ μ„±μž₯기🌿

0개의 λŒ“κΈ€