Brute Force (무μνκ² νκΈ°)
1. κ°μ
- μ¬λλ€μ΄ κ°μ₯ λ§μ΄ νλ μ€μλ μ¬μ΄ λ¬Έμ λ₯Ό μ΄λ ΅κ² νΈλ κ²
- λ¬Έμ λ₯Ό λ§μ£Όνκ³ λλ©΄ κ°μ₯ λ¨Όμ
무μνκ² ν μ μμκΉ
λΌλ μ§λ¬Έμ μ€μ€λ‘μκ² νμ - λ§ κ·Έλλ‘ μ»΄ν¨ν°μ λΉ λ₯Έ κ³μ° λ₯λ ₯μ μ΄μ©ν΄ κ°λ₯ν κ²½μ°μ μλ₯Ό μΌμΌμ΄ λμ΄νλ©΄μ λ΅μ μ°Ύλ λ°©λ²
- μ΄λ° λ°©λ²μ νν μμ νμ μ΄λΌκ³ λΆλ₯΄κ³ , μ κ΅³μ΄ μΈκΈν κΉ μΆμ§λ§, μ»΄ν¨ν°μ μ₯μ μ κ²°κ΅ μλκ° λΉ λ₯΄λ€λ κ²μ΄κΈ°μ μ₯μ μ μ νμ©νλ κ²μ΄κΈ°λ νλ€.
2. μ¬κ· νΈμΆκ³Ό μμ νμ
2-1. μ¬κ· νΈμΆ(ν¨μ)
-
μ¬κ· νΈμΆ(ν¨μ) λ μμ μ΄ μνν μμ μ μ μ¬ν ννμ μ¬λ¬ μ‘°κ°μΌλ‘ μͺΌκ° λ€ κ·Έ μ€ ν μ‘°κ°μ μννκ³ , λλ¨Έμ§λ₯Ό μκΈ° μμ μ νΈμΆν΄ μ€ννλ ν¨μλ₯Ό κ°λ¦¬ν΄
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 1λΆν° nκΉμ§μ ν©μ ꡬνλ λ°λ³΅λ¬Έκ³Ό μ¬κ·ν¨μ int sum(int n) { int ret = 0; for(int i = 1; i <= n; i++) { ret += i; } return ret; } int recursiveSum(int n) { if(n == 1) { return 1; } return n + recursiveSum(n-1); }
-
μ¬κ·ν¨μμ κ²½μ° if λ¬Έμ μ£Όλͺ©μ νλ©΄, μ΄ μ‘°κ±΄λ¬Έμ΄ μμΌλ©΄ ν¨μκ° μ λλ‘ λμμ νμ§ μμ κ²μ λλ€. n=1 μ΄λ©΄ μ‘°κ°μ΄ νλ λΏμ΄λ, ν κ°λ₯Ό λΉΌκ³ λλ©΄ λ μ΄μ μ²λ¦¬ν μμ μ΄ μκΈ° λλ¬Έ.
-
λͺ¨λ μ¬κ· ν¨μλ μ΄μ κ°μ΄
λμ΄μ μͺΌκ°μ§μ§ μλ
μ΅μνμ μμ μ λλ¬νμ λ λ΅μ 곧μ₯ λ°ννλ 쑰건문μ ν¬ν¨ν΄μΌ νλλ°. μ΄λ₯ΌκΈ°μ μ¬λ‘ (base case)
λΌκ³ νλ€. -
κΈ°μ μ¬λ‘λ₯Ό μ νν λλ μ‘΄μ¬νλ λͺ¨λ μ λ ₯μ΄ νμ κΈ°μ μ¬λ‘μ λ΅μ μ΄μ©ν΄ κ³μ°λ μ μλλ‘ ν΄μΌν¨. λ§μ½μ n μ΄ 1μΈ κ²½μ°λ₯Ό νμΈνλ κ² μλλΌ 2λΌλ©΄ 3μ λ°ννλ€κ³ νλ©΄ μ λ ₯μ΄ 2 μ΄μμΌ λλ λ¬Έμ κ° μμ§λ§, 1μ΄ λ€μ΄μ€λ©΄ λ¬Έμ κ° μκΉ
2-2. μμ ) λ³΄κΈ κ²μ
-
5x5 ν¬κΈ°μ μνλ²³ 격μλ₯Ό κ°μ§κ³ νλ κ²μμΌλ‘ μνμ’μ°/λκ°μ μΌλ‘ μΈμ ν μΉΈλ€μ κΈμλ₯Ό μ΄μ΄ λ¨μ΄λ₯Ό μ°Ύμλ΄λ κ²μ
-
hasWord(x, y, word) = λ³΄κΈ κ²μνμ (y,x)μμ μμνλ λ¨μ΄ word μ μ‘΄μ¬μ¬λΆλ₯Ό λ°ννλ€.
U R L P M X P R E T G I A E T X T N Z Y X O Q R S -
λ¬Έμ μ λΆν
- κ°μ₯ μμ°μ€λ¬μ΄ λ°©λ²μ κ° κΈμλ₯Ό νλμ μ‘°κ°μΌλ‘ λ§λλ κ²
- ν¨μ νΈμΆμμ λ¨μ΄μ μμ μμΉλ₯Ό μ ν΄ μ£ΌκΈ° λλ¬Έμ 첫 κΈμκ° λ€λ₯΄λ©΄ λ°λ‘ false
- κ·Έ μ΄νμ word[1..] μ μμ μμΉλ 첫 κΈμμ μμΉμμ μΈμ ν 8μΉΈ μ€ νλ μ΄λ―λ‘, μ¬λ κ²½μ°λ₯Ό λͺ¨λ μλνμ¬ λ΅μ μ°ΎμΌλ©΄ λ¨
-
κΈ°μ μ¬λ‘μ μ ν
- μμΉ (y,x) μ μλ κΈμκ° μνλ λ¨μ΄μ 첫 κΈμκ° μλ κ²½μ° νμ μ€ν¨
- (1λ²μ ν΄λΉνμ§ μμ κ²½μ°) μνλ λ¨μ΄κ° ν κΈμμΈ κ²½μ° νμ μ±κ³΅
- (ν) μ λ ₯μ΄ μλͺ»λκ±°λ, λ²μμμ λ²μ΄λ κ²½μ°λ κΈ°μ μ¬λ‘λ‘ μ νν΄μ λ²μ΄λκ² νλ λ°©λ²μ΄ μμ
-
ꡬν
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
private int[8] dx = {-1, -1, -1, 1, 1, 1, 0, 0} private int[8] dy = {-1, 0, 1, -1, 0, 1, -1, 1} public boolean hasWord(int y, int x, String word) { //κΈ°μ μ¬λ‘ 1 : μμ μμΉκ° λ²μ λ°μ΄λ©΄ 무쑰건 μ€ν¨ if(!inRange(y, x)) { return false; } //κΈ°μ μ¬λ‘ 2 : 첫 κΈμκ° μΌμΉνμ§ μμΌλ©΄ μ€ν¨ if(board[y][x] != word.charAt(0)) { return false; } //κΈ°μ μ¬λ‘ 3 : λ¨μ΄ κΈΈμ΄κ° 1μ΄λ©΄ μ±κ³΅ if(word.length() == 1) { return true; } //μΈμ ν μ¬λ μΉΈμ κ²μ¬ for(int direction = 0; direction < 8; direction++) { int nextY = y + dy[direction]; int nextX = x + dx[direction]; // λ€μ μΉΈμ΄ λ²μ μμ μλμ§, 첫 κΈμλ μΌμΉνλμ§ νμΈν νμ μμ if(hasWord(nextY, nextX, word.substring(1))) { return true; } } return false; }
μκ° λ³΅μ‘λ λΆμ
- μκ° λ³΅μ‘λλ₯Ό κ³μ°νλ κ²μ λΉκ΅μ λ¨μνλ€. κ°λ₯ν λ΅ ν보λ€μ λͺ¨λ λ§λ€μ΄ 보기 λλ¬Έμ μκ° λ³΅μ‘λλ₯Ό κ³μ°νκΈ° μν΄μλ κ°λ₯ν ν보μ μλ₯Ό μ λΆ μΈμ΄ λ³΄κΈ°λ§ νλ©΄ λ¨
- νμ¬ κ²μ¬νλ ν보μ μλ μ΅λ 8^N-1 = O(8^N)μ΄ λκ³ , μ΄κ²μ΄ μκ° λ³΅μ‘λκ° λ¨
- ν보μ μλ λ¨μ΄μ κΈΈμ΄μ λ°λΌ μ§μμ μΌλ‘ μ¦κ°νκΈ° λλ¬Έμ λ¨μ΄μ κΈΈμ΄κ° 짧μ κ²½μ°μλ§ νλλ‘νκ³ , λ¨μ΄μ κΈΈμ΄κ° μ‘°κΈμ΄λΌλ κΈΈμ΄μ§ κ²½μ° λμ κ³νλ² λ±μ μ¬μ©ν΄μΌ ν¨
3. κ΄λ ¨ λ¬Έμ
- λͺ¨λ μμ΄(permutation) λ§λ€κΈ°
- λͺ¨λ μ‘°ν©(combination) λ§λ€κΈ°
- 2^n κ°μ§ κ²½μ°μ μ λ§λ€κΈ°