[๋ฌธ์ ]
[๋ฌธ์ ์ค๋ช ]
์ค๋์ฟ ๊ฒ์์ ๋ต์ ์ฐพ๋ ๋ฌธ์ ~!
์ค๋์ฟ ๊ฒ์ ์กฐ๊ฑด์ ์๋ 2๊ฐ์ง๋ค.
- ๊ฐ๊ฐ์ ๊ฐ๋ก์ค๊ณผ ์ธ๋ก์ค์๋ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ํ ๋ฒ์ฉ๋ง ๋ํ๋์ผ ํ๋ค.
- ๊ตต์ ์ ์ผ๋ก ๊ตฌ๋ถ๋์ด ์๋ 3x3 ์ ์ฌ๊ฐํ ์์๋ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ํ ๋ฒ์ฉ๋ง ๋ํ๋์ผ ํ๋ค.
[๋ฌธ์ ํ์ด]
์ฒจ์ ์์๋ง ๋ณด๊ณ ๊ฐ๋ก, ์ธ๋ก, 3x3์ ํ์ํด์ ํ์นธ๋ง ๋น์ด์ ๋ฐ๋ก ํ์ ์๋ ์นธ์ ํ๊ณ ๋ค์ ์นธ์ ํธ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค. ๊ฒฐ๊ณผ๋ ๋๋ง... ์๋ ๋ฐ๋ก์ฒ๋ผ ๋น์นธ์ด ๋ง์ ๋๋ ํฌํจํด์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋, ๋ต์ด ์ฌ๋ฌ๊ฐ์ผ ๋๋ ์ ์ผ ์ฒ์ ๊ตฌํด์ง๊ฑธ ๋ต์ผ๋ก ์ฑํํ๋ค!!! exit(0); !!!
[ํ๋ฆฐ์ฝ๋]
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
void Input();
void Stocoo();
bool FillNumber(bool *check_num, int x, int y, int index);
void Output();
int map[9][9];
vector<pair<pair<int, int>, bool>> blank;
int main() {
Input();
Stocoo();
Output();
return 0;
}
void Input() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cin >> map[i][j];
if (map[i][j] == 0) {
blank.push_back(make_pair(make_pair(i, j), false));
}
}
}
}
void Stocoo() {
for (int i = 0; i < 9; i++) {
int x = blank[i].first.first;
int y = blank[i].first.second;
bool check_num[10] = { false, };
int check = 0;
//๊ฐ๋ก
for (int col = 0; col < 9; col++) {
if (map[x][col] != 0) {
check_num[map[x][col]] = true;
check++;
}
}
if (check == 8) { if (FillNumber(check_num, x, y, i)) continue; }
memset(check_num, false, sizeof(check_num));
check = 0;
//์ธ๋ก
for (int row = 0; row < 9; row++) {
if (map[row][y] != 0) {
check_num[map[row][y]] = true;
check++;
}
}
if (check == 8) { if (FillNumber(check_num, x, y, i)) continue; }
memset(check_num, false, sizeof(check_num));
check = 0;
//3x3
for (int row = x / 3 * 3; row < x / 3 * 3 + 3; row++) {
for (int col = y / 3 * 3; col < y / 3 * 3 + 3; col++) {
if (map[row][col] != 0) {
check_num[map[row][col]] = true;
check++;
}
}
}
if (check == 8) { if (FillNumber(check_num, x, y, i)) continue; }
}
for (int i = 0; i < blank.size(); i++) {
if (!blank[i].second) {
Stocoo();
}
}
}
bool FillNumber(bool *check_num, int x, int y, int index) {
for (int i = 1; i < 10; i++) {
if (!check_num[i]) {
map[x][y] = i;
blank[index].second = true;
return true;
}
}
return false;
}
void Output() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cout << map[i][j] << " ";
}
cout << "\n";
}
}
์ฆ, ํ์ด๊ณผ์ ์ ์ ์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
1) bruteforce๋ก ๋น์นธ์ ๊ฐ๋ก, ์ธ๋ก, 3x3 ์กฐ๊ฑด์ ๋ง์กฑํ๋ 1~9๋ฅผ ๋ชจ๋ ๋ฃ์ด๋ณธ๋ค.
2) ๋ง์ฝ ๋ฃ์ ์ ์๋ ์๊ฐ ์๋ค๋ฉด ์ด์ ์ ๋ฃ์ ๊ฐ์ด ๋ฌธ์ ์ด๋ฏ๋ก backtracking์ผ๋ก ๋์๊ฐ์(return) ๋ค์ ๊ฐ์ ๋ฃ์ด๋ณธ๋ค.
3) ๋ชจ๋ ์นธ์ ์ฑ์ ๋ค๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
๊ทผ๋ฐ backtracking ์์ returnํด์ map[x][y] = 0; ๊ตฌ๋ฌธ์ ์ ์ด์คฌ๋๋ฐ, ์ด ๊ตฌ๋ฌธ์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ค.
๋ผ ์ ์ ๋ง์ ๋ ๋ค์ ๋ด๋ด์ผ์ง ใ ใ ...
[๋ฐ๋ก ์์ ]
TEST CASE # 1
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
SAMPLE ANSWER #1
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 1 4 3 6 5 8 9 7
3 6 5 8 9 7 2 1 4
8 9 7 2 1 4 3 6 5
5 3 1 6 4 2 9 7 8
6 4 2 9 7 8 5 3 1
9 7 8 5 3 1 6 4 2
TEST CASE # 2
0 2 0 9 0 5 0 0 0
5 9 0 0 3 0 2 0 0
7 0 0 6 0 2 0 0 5
0 0 9 3 5 0 4 6 0
0 5 4 0 0 0 7 8 0
0 8 3 0 2 7 5 0 0
8 0 0 2 0 9 0 0 4
0 0 5 0 4 0 0 2 6
0 0 0 5 0 3 0 7 0
SAMPLE ANSWER # 2
3 2 1 9 7 5 6 4 8
5 9 6 8 3 4 2 1 7
7 4 8 6 1 2 9 3 5
1 7 9 3 5 8 4 6 2
2 5 4 1 9 6 7 8 3
6 8 3 4 2 7 5 9 1
8 1 7 2 6 9 3 5 4
9 3 5 7 4 1 8 2 6
4 6 2 5 8 3 1 7 9
[์ฝ๋]
#include <iostream>
#include <vector>
using namespace std;
void Input();
void Stocoo(int blank_index);
bool CheckNumber(int x, int y, int num);
void Output();
int map[9][9];
vector<pair<int, int>> blank_position;
int main() {
Input();
Stocoo(0);
Output();
return 0;
}
void Input() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cin >> map[i][j];
if (map[i][j] == 0) {
blank_position.push_back(make_pair(i, j));
}
}
}
}
void Stocoo(int blank_index) {
if (blank_index == blank_position.size()) {
Output();
exit(0); //๋ชจ๋๊ฐ 0์ผ๋ก ์ด๋ฃจ์ด์ง ์ค๋์ฟ ์ฒ๋ผ ๋ต์ด ์ฌ๋ฌ๊ฐ์ผ ์๋ ์๋๋ฐ,
//๊ทธ๋ด ๋ ์ ์ผ ์ฒซ๋ฒ์งธ๋ก ๊ตฌํด์ง ๋ต์ ์ ๋ต์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋์ด์ ๊ตฌํ์ง ์๋๋ก. ์ข
๋ฃ์ํจ๋ค.
}
int x = blank_position[blank_index].first;
int y = blank_position[blank_index].second;
for (int num = 1; num < 10; num++) { // 1, 2, 3, 4, 5, 6, 7, 8, 9 ํ๋์ฉ ๋ฃ์ด๋ณด๊ธฐ
//์กฐ๊ฑด์ ๋ง๋์ง ์ฒดํฌ
if (CheckNumber(x, y, num)) {
//์กฐ๊ฑด์ ๋ง์ผ๋ฉด ๋ค์ blank ์ฑ์ฐ๋ฌ๊ฐ๊ธฐ
map[x][y] = num;
Stocoo(blank_index+1);//*****์ฃผ์: blank_index++๋ก ๋ฃ์ผ๋ฉด ์๋ค๊ฐ์ง
//๋ค์๊ฑธ ๋ฃ์๊ฒ ์์ด์ return ๋์ ๋!
//Backtracking์ผ๋ก ๋ค์ gogo!
map[x][y] = 0;//???????? ์ด ๊ตฌ๋ฌธ์ด ์์ผ๋ฉด ์ ์๋ ๊น......
}
//์กฐ๊ฑด์ ๋ง์ง ์์ผ๋ฉด ๋ค์ ์ซ์ ๋ฃ์ด๋ณด๊ธฐ
}
}
bool CheckNumber(int x, int y, int num) {
//๊ฐ๋ก
for (int col = 0; col < 9; col++) {
if (y != col && map[x][col] == num) {
return false;
}
}
//์ธ๋ก
for (int row = 0; row < 9; row++) {
if (x != row && map[row][y] == num) {
return false;
}
}
//3x3
for (int row = x / 3 * 3; row < x / 3 * 3 + 3; row++) {//0,1,2,3,4,5,6,7,8,9 ๊ตฌ์ญ์ผ๋ก ๋๋
for (int col = y / 3 * 3; col < y / 3 * 3 + 3; col++) {
if (x != row && y != col && map[row][col] == num) {
return false;
}
}
}
return true;
}
void Output() {
cout << "\n";
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
cout << map[i][j] << " ";
}
cout << "\n";
}
}
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++][BAEKJOON][์ํ] 1041๋ฒ ์ฃผ์ฌ์ ๋ฌธ์ ํ์ด & ๋ฐ๋ก (0) | 2021.10.11 |
---|---|
[C++][BAKJOON][์ํ] 1541๋ฒ ์์ด๋ฒ๋ฆฐ ๊ดํธ ํ์ด & ๋ฐ๋ก (0) | 2021.10.11 |
[C++][BAEKJOON][TREE&DP] 2533๋ฒ ์ฌํ๋ง ์๋น์ค(SNS) (0) | 2021.10.04 |
[BAEKJOON][C++][์๋ฎฌ๋ ์ด์ ] 16236๋ฒ ์๊ธฐ์์ด (0) | 2021.09.25 |
[C++][ํ๋ก๊ทธ๋๋จธ์ค][Heap] ๋ ๋งต๊ฒ (0) | 2021.09.22 |