๐Ÿ™‡โ€โ™€๏ธ[Gold IV] ์Šค๋„์ฟ  - 2239

๋ฌธ์ œ ๋งํฌ

์„ฑ๋Šฅ ์š”์•ฝ

๋ฉ”๋ชจ๋ฆฌ: 2024 KB, ์‹œ๊ฐ„: 568 ms

๋ถ„๋ฅ˜

๋ฐฑํŠธ๋ž˜ํ‚น, ๊ตฌํ˜„

์ œ์ถœ ์ผ์ž

2024๋…„ 2์›” 22์ผ 10:32:44

๋ฌธ์ œ ์„ค๋ช…

์Šค๋„์ฟ ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ˆซ์ž ํผ์ฆ์ด๋‹ค. 9ร—9 ํฌ๊ธฐ์˜ ๋ณด๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ๊ฐ ํ–‰๊ณผ ๊ฐ ์—ด, ๊ทธ๋ฆฌ๊ณ  9๊ฐœ์˜ 3ร—3 ํฌ๊ธฐ์˜ ๋ณด๋“œ์— 1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ์ค‘๋ณต ์—†์ด ๋‚˜ํƒ€๋‚˜๋„๋ก ๋ณด๋“œ๋ฅผ ์ฑ„์šฐ๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ๋ณด์ž.

image

์œ„ ๊ทธ๋ฆผ์€ ์ฐธ ์ž˜๋„ ์Šค๋„์ฟ  ํผ์ฆ์„ ํ‘ผ ๊ฒฝ์šฐ์ด๋‹ค. ๊ฐ ํ–‰์— 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;
}

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: