BOJ 2239. ์ค๋์ฟ
๐โโ๏ธ[Gold IV] ์ค๋์ฟ - 2239
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2024 KB, ์๊ฐ: 568 ms
๋ถ๋ฅ
๋ฐฑํธ๋ํน, ๊ตฌํ
์ ์ถ ์ผ์
2024๋ 2์ 22์ผ 10:32:44
๋ฌธ์ ์ค๋ช
์ค๋์ฟ ๋ ๋งค์ฐ ๊ฐ๋จํ ์ซ์ ํผ์ฆ์ด๋ค. 9ร9 ํฌ๊ธฐ์ ๋ณด๋๊ฐ ์์ ๋, ๊ฐ ํ๊ณผ ๊ฐ ์ด, ๊ทธ๋ฆฌ๊ณ 9๊ฐ์ 3ร3 ํฌ๊ธฐ์ ๋ณด๋์ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ์ค๋ณต ์์ด ๋ํ๋๋๋ก ๋ณด๋๋ฅผ ์ฑ์ฐ๋ฉด ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์์ ๋ณด์.
์ ๊ทธ๋ฆผ์ ์ฐธ ์๋ ์ค๋์ฟ ํผ์ฆ์ ํผ ๊ฒฝ์ฐ์ด๋ค. ๊ฐ ํ์ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ์ค๋ณต ์์ด ๋์ค๊ณ , ๊ฐ ์ด์ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ์ค๋ณต ์์ด ๋์ค๊ณ , ๊ฐ 3ร3์ง๋ฆฌ ์ฌ๊ฐํ(9๊ฐ์ด๋ฉฐ, ์์์ ์๊น๋ก ํ์๋์๋ค)์ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ์ค๋ณต ์์ด ๋์ค๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๋ค ๋ง ์ค๋์ฟ ํผ์ฆ์ด ์ฃผ์ด์ก์ ๋, ๋ง์ ๋๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
9๊ฐ์ ์ค์ 9๊ฐ์ ์ซ์๋ก ๋ณด๋๊ฐ ์ ๋ ฅ๋๋ค. ์์ง ์ซ์๊ฐ ์ฑ์์ง์ง ์์ ์นธ์๋ 0์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
9๊ฐ์ ์ค์ 9๊ฐ์ ์ซ์๋ก ๋ต์ ์ถ๋ ฅํ๋ค. ๋ต์ด ์ฌ๋ฌ ๊ฐ ์๋ค๋ฉด ๊ทธ ์ค ์ฌ์ ์์ผ๋ก ์์๋ ๊ฒ์ ์ถ๋ ฅํ๋ค. ์ฆ, 81์๋ฆฌ์ ์๊ฐ ์ ์ผ ์์ ๊ฒฝ์ฐ๋ฅผ ์ถ๋ ฅํ๋ค.
๐ํ์ด
๋ฐฑํธ๋ํน ๋ฌธ์ ๋ก DFS๋ฅผ ์ด์ฉํ๋ค.
๋ฌธ์ ์ ๋น ์นธ์ 1~9์ ๊ฐ์ ๋ชจ๋ ๋์ ํ์ฌ ์ ๋ต์ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์์ผํ๋ค.
int board[9][9]; // ์ค๋์ฟ ๋ณด๋ ์ ์ธ
vector<pair<int, int>> points; // ๋น์นธ์ ์์น ์ ์ฅ
int cnt = 0;
bool found = false; // ์ค๋์ฟ ํ ์์ฑ ํ๋๊ทธ
์ ์ญ๋ณ์๋ ์ด๋ ๊ฒ ์ก์๊ณ ์ ๋ ฅ ๊ฐ์ ๋ฐ๋๋ค.
void solve()
{
pair<int, int> point;
for (int i = 0; i < 9; i++)
{
string str;
cin >> str;
for (int j = 0; j < 9; j++)
{
board[i][j] = str[j] - '0';
if (board[i][j] == 0)
{
cnt++;
point.first = i;
point.second = j;
points.push_back(point); // ๋น์นธ์ ์ขํ ์ ์ฅ
}
}
}
sudoku(0);
}
sudokuํจ์๊ฐ DFS์ด๋ค.
void sudoku(int N)
{
if (N == cnt) // ๋น์นธ์ ๊ฐ์๋งํผ์ ์ฑ์์ ์ค๋์ฟ ํ์ด ์์ฑ๋๋ฉด
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cout << board[i][j];
}
cout << '\n';
} // ๊ฒฐ๊ณผ ์ถ๋ ฅ
found = true; // ํ๋๊ทธ true๋ก ๋ณ๊ฒฝ
return;
}
for (int j = 1; j <= 9; j++)
{
board[points[N].first][points[N].second] = j; // 1~9 ๊น์ง์ ์ซ์๋ฅผ ๋ฃ์ด๋ด
if (check(points[N])) // ๊ฒฐ๊ณผ๊ฐ ์ ํจํ๋ฉด ๋ค์ ๋น์นธ์ ์ฑ์ฐ๋ฌ ๊ฐ
sudoku(N + 1);
if (found) // ์ค๋์ฟ ๊ฐ ์์ฑ๋ฌ์๊ฒฝ์ฐ ๋ ์ด์ ๋ค๋ฅธ ํด๋ฅผ ์ฐพ์ ํ์๊ฐ ์์ผ๋ฏ๋ก ํจ์ ์ข
๋ฃ
return;
}
board[points[N].first][points[N].second] = 0;// ์ต์ ํด๋ฅผ ๋ชป์ฐพ์์ ๊ฒฝ์ฐ ๊ฐ ๋น์์ฃผ๊ธฐ
return;
}
ํ ์นธ์ ๊ฐ์ ๋์ ํ ๋ ์ ๋ต์ด ๋๋์ง ํ์ธํ๋ ํจ์๋ก checkํจ์์ด๋ค.
bool check(pair<int, int> p)
{
int square_x = p.first / 3; // ๊ตฌ์ญ์ ๋๋
int square_y = p.second / 3;
for (int i = 0; i < 9; i++)
{
if (board[p.first][i] == board[p.first][p.second] && i != p.second)
return false; // ๊ฐ์ ํ์ ๊ฐ์ ์ซ์๊ฐ ์์ผ๋ฉด false ๋ฐํ
if (board[i][p.second] == board[p.first][p.second] && i != p.first)
return false; // ๊ฐ์ ์ด์ ๊ฐ์ ์ซ์๊ฐ ์์ผ๋ฉด false ๋ฐํ
}
for (int i = 3 * square_x; i < 3 * square_x + 3; i++)
{
for (int j = 3 * square_y; j < 3 * square_y + 3; j++)
{
if (board[i][j] == board[p.first][p.second])
{
if (i != p.first && j != p.second)
return false; // ๊ฐ์ ๊ตฌ์ญ์ ๊ฐ์ ์ซ์๊ฐ ์์ผ๋ฉด false ๋ฐํ
}
}
}
return true; // ๋ชจ๋ ์กฐ๊ฑด ๋ง์กฑ์ ์ ํจ์ฑ ๊ฒ์ฌ ํต๊ณผ
}
DFS์์ ์ต์ ํด๋ฅผ ์ฐพ์ง ๋ชปํ์์ ๋ ๊ฐ์ ๋ค์ 0์ผ๋ก ์ธํ ํด์ผํ๋ค.
์ฒ์์ 0์ผ๋ก ๋์ด ์๋ ๋ถ๋ถ์ 1~9๊น์ง ๋ค ์ฑ์ฐ๊ณ ์ ์ฒด๊ฐ ์ ๋ต์ด ๋๋์ง ํ์ธํ๋ฉด์ ๋ฌธ์ ๋ฅผ ํ๋ ค๊ณ ํ๋๋ฐ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ ค์ ํ์ง ๋ชปํ๋ค.
์ด๋ ๊ฒ ํ๋ํ๋ ์ธํ ํ๋ฉด์ ๋ฌธ์ ๋ฅผ ํ์ด์ผํ๋ค.
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
int board[9][9]; // ์ค๋์ฟ ๋ณด๋ ์ ์ธ
vector<pair<int, int>> points; // ๋น์นธ์ ์์น ์ ์ฅ
int cnt = 0;
bool found = false; // ์ค๋์ฟ ํ ์์ฑ ํ๋๊ทธ
bool check(pair<int, int> p)
{
int square_x = p.first / 3; // ๊ตฌ์ญ์ ๋๋
int square_y = p.second / 3;
for (int i = 0; i < 9; i++)
{
if (board[p.first][i] == board[p.first][p.second] && i != p.second)
return false; // ๊ฐ์ ํ์ ๊ฐ์ ์ซ์๊ฐ ์์ผ๋ฉด false ๋ฐํ
if (board[i][p.second] == board[p.first][p.second] && i != p.first)
return false; // ๊ฐ์ ์ด์ ๊ฐ์ ์ซ์๊ฐ ์์ผ๋ฉด false ๋ฐํ
}
for (int i = 3 * square_x; i < 3 * square_x + 3; i++)
{
for (int j = 3 * square_y; j < 3 * square_y + 3; j++)
{
if (board[i][j] == board[p.first][p.second])
{
if (i != p.first && j != p.second)
return false; // ๊ฐ์ ๊ตฌ์ญ์ ๊ฐ์ ์ซ์๊ฐ ์์ผ๋ฉด false ๋ฐํ
}
}
}
return true; // ๋ชจ๋ ์กฐ๊ฑด ๋ง์กฑ์ ์ ํจ์ฑ ๊ฒ์ฌ ํต๊ณผ
}
void sudoku(int N)
{
if (N == cnt) // ๋น์นธ์ ๊ฐ์๋งํผ์ ์ฑ์์ ์ค๋์ฟ ํ์ด ์์ฑ๋๋ฉด
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cout << board[i][j];
}
cout << '\n';
} // ๊ฒฐ๊ณผ ์ถ๋ ฅ
found = true; // ํ๋๊ทธ true๋ก ๋ณ๊ฒฝ
return;
}
for (int j = 1; j <= 9; j++)
{
board[points[N].first][points[N].second] = j; // 1~9 ๊น์ง์ ์ซ์๋ฅผ ๋ฃ์ด๋ด
if (check(points[N])) // ๊ฒฐ๊ณผ๊ฐ ์ ํจํ๋ฉด ๋ค์ ๋น์นธ์ ์ฑ์ฐ๋ฌ ๊ฐ
sudoku(N + 1);
if (found) // ์ค๋์ฟ ๊ฐ ์์ฑ๋ฌ์๊ฒฝ์ฐ ๋ ์ด์ ๋ค๋ฅธ ํด๋ฅผ ์ฐพ์ ํ์๊ฐ ์์ผ๋ฏ๋ก ํจ์ ์ข
๋ฃ
return;
}
board[points[N].first][points[N].second] = 0;// ์ต์ ํด๋ฅผ ๋ชป์ฐพ์์ ๊ฒฝ์ฐ ๊ฐ ๋น์์ฃผ๊ธฐ
return;
}
void solve()
{
pair<int, int> point;
for (int i = 0; i < 9; i++)
{
string str;
cin >> str;
for (int j = 0; j < 9; j++)
{
board[i][j] = str[j] - '0';
if (board[i][j] == 0)
{
cnt++;
point.first = i;
point.second = j;
points.push_back(point); // ๋น์นธ์ ์ขํ ์ ์ฅ
}
}
}
sudoku(0);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}