코딩 공부/알고리즘

백트래킹

공부를 함 2024. 10. 18. 02:54

백트래킹?

현재 상태에서 가능한 모든 후보군을 따라 들어가며 탐색하는 알고리즘이다.

 

 

연습 문제

 

1. 백준 15649 : https://www.acmicpc.net/problem/15649

using System.Text;

var input = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int n = input[0], m = input[1];
int[] arr = new int[10];
bool[] isUsed = new bool[10];
StringBuilder sb = new StringBuilder();

void method(int k)
{
    if(k == m)
    {
        for (int i = 0; i < m; i++)
        {
            sb.Append(new string(arr[i] + " "));
        }
        sb.Append('\n');
        return;
    }
    for(int i = 1; i <= n; i++) //백트래킹 핵심
    {
        if (!isUsed[i])
        {
            arr[k] = i;
            isUsed[i] = true;
            method(k + 1);
            isUsed[i] = false;
        }
    }
}
method(0);
Console.WriteLine(sb.ToString());

 

백트래킹의 핵심이라 주석을 작성해둔 부분의 for문은 최대한 외우는 편이 좋을 것 같다.

나중에 시간이 된다면 N과M 시리즈를 모두 풀어보고자 한다.

 

2. 백준 9663 : https://www.acmicpc.net/problem/9663

var n = int.Parse(Console.ReadLine());

bool[] isUsed1, isUsed2, isUsed3;

int count = 0;

void SolveNQueens(int cur)
{
    if (cur == n)
    {
        count++;
        return;
    }

    for (int i = 0; i < n; i++)
    {
        if (!isUsed1[i] && !isUsed2[cur + i] && !isUsed3[cur - i + n - 1])
        {
            isUsed1[i] = isUsed2[cur + i] = isUsed3[cur - i + n - 1] = true;
            SolveNQueens(cur + 1);
            isUsed1[i] = isUsed2[cur + i] = isUsed3[cur - i + n - 1] = false;
        }
    }
}

isUsed1 = new bool[n];
isUsed2 = new bool[2 * n - 1];
isUsed3 = new bool[2 * n - 1];

SolveNQueens(0);
Console.WriteLine(count);

 

 

3. 백준 1182 : https://www.acmicpc.net/problem/1182

 

var input = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
var input2 = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
var n = input[0];
var s = input[1];
int count = 0;

void Solve(int cur, int total)
{
    if(cur == n) {if(total == s) count++; return;}
    Solve(cur+1, total);
    Solve(cur+1, total + input2[cur]);
}

Solve(0, 0);
if(s == 0) count--;
Console.WriteLine(count);

'코딩 공부 > 알고리즘' 카테고리의 다른 글

정렬  (0) 2024.10.21
재귀  (1) 2024.10.15
DFS  (0) 2024.10.13
BFS  (0) 2024.10.13
스택 활용  (0) 2024.10.12