๐Ÿ•๏ธ ICPC Sinchon/Backtracking

[BOJ][C++] ๋ฐฑ์ค€ 2580๋ฒˆ: ์Šค๋„์ฟ 

์„ ๋‹ฌ 2023. 1. 22. 04:09
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/2580

 

2580๋ฒˆ: ์Šค๋„์ฟ 

์Šค๋„์ฟ ๋Š” 18์„ธ๊ธฐ ์Šค์œ„์Šค ์ˆ˜ํ•™์ž๊ฐ€ ๋งŒ๋“  '๋ผํ‹ด ์‚ฌ๊ฐํ˜•'์ด๋ž‘ ํผ์ฆ์—์„œ ์œ ๋ž˜ํ•œ ๊ฒƒ์œผ๋กœ ํ˜„์žฌ ๋งŽ์€ ์ธ๊ธฐ๋ฅผ ๋ˆ„๋ฆฌ๊ณ  ์žˆ๋‹ค. ์ด ๊ฒŒ์ž„์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ€๋กœ, ์„ธ๋กœ ๊ฐ๊ฐ 9๊ฐœ์”ฉ ์ด 81๊ฐœ์˜ ์ž‘์€ ์นธ์œผ๋กœ ์ด๋ฃจ

www.acmicpc.net

 

๋ฌธ์ œ

์Šค๋„์ฟ ๋Š” 18์„ธ๊ธฐ ์Šค์œ„์Šค ์ˆ˜ํ•™์ž๊ฐ€ ๋งŒ๋“  '๋ผํ‹ด ์‚ฌ๊ฐํ˜•'์ด๋ž‘ ํผ์ฆ์—์„œ ์œ ๋ž˜ํ•œ ๊ฒƒ์œผ๋กœ ํ˜„์žฌ ๋งŽ์€ ์ธ๊ธฐ๋ฅผ ๋ˆ„๋ฆฌ๊ณ  ์žˆ๋‹ค. ์ด ๊ฒŒ์ž„์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ€๋กœ, ์„ธ๋กœ ๊ฐ๊ฐ 9๊ฐœ์”ฉ ์ด 81๊ฐœ์˜ ์ž‘์€ ์นธ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ •์‚ฌ๊ฐํ˜• ํŒ ์œ„์—์„œ ์ด๋ค„์ง€๋Š”๋ฐ, ๊ฒŒ์ž„ ์‹œ์ž‘ ์ „ ์ผ๋ถ€ ์นธ์—๋Š” 1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘ ํ•˜๋‚˜๊ฐ€ ์“ฐ์—ฌ ์žˆ๋‹ค.

๋‚˜๋จธ์ง€ ๋นˆ ์นธ์„ ์ฑ„์šฐ๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๊ฐ๊ฐ์˜ ๊ฐ€๋กœ์ค„๊ณผ ์„ธ๋กœ์ค„์—๋Š” 1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋‚˜ํƒ€๋‚˜์•ผ ํ•œ๋‹ค.
  2. ๊ตต์€ ์„ ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋Š” 3x3 ์ •์‚ฌ๊ฐํ˜• ์•ˆ์—๋„ 1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋‚˜ํƒ€๋‚˜์•ผ ํ•œ๋‹ค.

์œ„์˜ ์˜ˆ์˜ ๊ฒฝ์šฐ, ์ฒซ์งธ ์ค„์—๋Š” 1์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ 2๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž๋“ค์ด ์ด๋ฏธ ๋‚˜ํƒ€๋‚˜ ์žˆ์œผ๋ฏ€๋กœ ์ฒซ์งธ ์ค„ ๋นˆ์นธ์—๋Š” 1์ด ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค.

๋˜ํ•œ ์œ„์ชฝ ๊ฐ€์šด๋ฐ ์œ„์น˜ํ•œ 3x3 ์ •์‚ฌ๊ฐํ˜•์˜ ๊ฒฝ์šฐ์—๋Š” 3์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ˆซ์ž๋“ค์ด ์ด๋ฏธ ์“ฐ์—ฌ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์šด๋ฐ ๋นˆ ์นธ์—๋Š” 3์ด ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค.

์ด์™€ ๊ฐ™์ด ๋นˆ ์นธ์„ ์ฐจ๋ก€๋กœ ์ฑ„์›Œ ๊ฐ€๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๊ฒŒ์ž„ ์‹œ์ž‘ ์ „ ์Šค๋„์ฟ  ํŒ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆซ์ž๋“ค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ๋ชจ๋“  ๋นˆ ์นธ์ด ์ฑ„์›Œ์ง„ ์ตœ์ข… ๋ชจ์Šต์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์•„ํ™‰ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— 9๊ฐœ์”ฉ ๊ฒŒ์ž„ ์‹œ์ž‘ ์ „ ์Šค๋„์ฟ ํŒ ๊ฐ ์ค„์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆซ์ž๊ฐ€ ํ•œ ์นธ์”ฉ ๋„์›Œ์„œ ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์Šค๋„์ฟ  ํŒ์˜ ๋นˆ ์นธ์˜ ๊ฒฝ์šฐ์—๋Š” 0์ด ์ฃผ์–ด์ง„๋‹ค. ์Šค๋„์ฟ  ํŒ์„ ๊ทœ์น™๋Œ€๋กœ ์ฑ„์šธ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์˜ ์ž…๋ ฅ์€ ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

์ถœ๋ ฅ

๋ชจ๋“  ๋นˆ ์นธ์ด ์ฑ„์›Œ์ง„ ์Šค๋„์ฟ  ํŒ์˜ ์ตœ์ข… ๋ชจ์Šต์„ ์•„ํ™‰ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— 9๊ฐœ์”ฉ ํ•œ ์นธ์”ฉ ๋„์›Œ์„œ ์ถœ๋ ฅํ•œ๋‹ค.

์Šค๋„์ฟ  ํŒ์„ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฟ์ธ ๊ฒฝ์šฐ๋Š” ๊ทธ ์ค‘ ํ•˜๋‚˜๋งŒ์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ œํ•œ

  • 12095๋ฒˆ ๋ฌธ์ œ์— ์žˆ๋Š” ์†Œ์Šค๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค.
    • C++14: 80ms
    • Java: 292ms
    • PyPy3: 1172ms

 

ํ’€์ด

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

typedef pair<int, int> ci;

vector<vector<int>> board(9, vector<int>(9,0));
vector<ci> blank;  // ๋นˆ ์นธ์˜ ์ขŒํ‘œ ์ •๋ณด๋“ค
int blankNum;
bool row[10][10]; // col[x][y] = x๋ฒˆ์งธ ์—ด์— y๋ผ๋Š” ์ˆซ์ž๊ฐ€ ์žˆ๋Š”๊ฐ€?
bool col[10][10];
bool box[10][10];
bool isFound = false;

void sudoku(int index) {
    if(index == blankNum) {
        for(int i=0; i<9; i++) {
            for(int j=0; j<9; j++)
                cout << board[i][j] << " ";
            cout << "\n";
        }
        isFound = true;
        return;
    }
    
    ci curPos = blank[index];
    int x = curPos.first;
    int y = curPos.second;
    for(int i=1; i<=9; i++) {
        if(row[x][i] || col[y][i] || box[(x/3)*3+(y/3)][i])
            continue;
        if(isFound)
            return;
        board[x][y] = i;
        row[x][i] = col[y][i] = box[(x/3)*3+(y/3)][i] = true;
        sudoku(index+1);
        row[x][i] = col[y][i] = box[(x/3)*3+(y/3)][i] = false;
    }
    
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    
    // ์ดˆ๊ธฐํ™”
    for(int i=0; i<9; i++)
        for(int j=0; j<9; j++)
            box[i][j] = col[i][j] = box[i][j] = false;
          
    // ์ž…๋ ฅ
    int input;
    for(int i=0; i<9; i++) {
        for(int j=0; j<9; j++) {
            cin >> input;
            if(input==0)
                blank.push_back({i,j});
            board[i][j] = input;
            row[i][input] = true;
            col[j][input] = true;
            box[(i/3)*3+(j/3)][input] = true;
        }
    }
    blankNum = blank.size();
    
    // ์—ฐ์‚ฐ
    sudoku(0);
    
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•