๐Ÿ• Baaaaaarking/0x0C๊ฐ• - ๋ฐฑํŠธ๋ž˜ํ‚น

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

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

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

 

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

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

www.acmicpc.net

 

๋ฌธ์ œ

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

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

ํ•˜๋‹ค ๋งŒ ์Šค๋„์ฟ  ํผ์ฆ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋งˆ์ € ๋๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

9๊ฐœ์˜ ์ค„์— 9๊ฐœ์˜ ์ˆซ์ž๋กœ ๋ณด๋“œ๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. ์•„์ง ์ˆซ์ž๊ฐ€ ์ฑ„์›Œ์ง€์ง€ ์•Š์€ ์นธ์—๋Š” 0์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

9๊ฐœ์˜ ์ค„์— 9๊ฐœ์˜ ์ˆซ์ž๋กœ ๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋‹ต์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋‹ค๋ฉด ๊ทธ ์ค‘ ์‚ฌ์ „์‹์œผ๋กœ ์•ž์„œ๋Š” ๊ฒƒ์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ฆ‰, 81์ž๋ฆฌ์˜ ์ˆ˜๊ฐ€ ์ œ์ผ ์ž‘์€ ๊ฒฝ์šฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ œํ•œ

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

 

ํ’€์ด

[๐Ÿ•๏ธ ICPC Sinchon Novice] - [BOJ][C++] ๋ฐฑ์ค€ 2580๋ฒˆ: ์Šค๋„์ฟ 

 

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

https://www.acmicpc.net/problem/2580 2580๋ฒˆ: ์Šค๋„์ฟ  ์Šค๋„์ฟ ๋Š” 18์„ธ๊ธฐ ์Šค์œ„์Šค ์ˆ˜ํ•™์ž๊ฐ€ ๋งŒ๋“  '๋ผํ‹ด ์‚ฌ๊ฐํ˜•'์ด๋ž‘ ํผ์ฆ์—์„œ ์œ ๋ž˜ํ•œ ๊ฒƒ์œผ๋กœ ํ˜„์žฌ ๋งŽ์€ ์ธ๊ธฐ๋ฅผ ๋ˆ„๋ฆฌ๊ณ  ์žˆ๋‹ค. ์ด ๊ฒŒ์ž„์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ€๋กœ,

whkakrkr.tistory.com

์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฌธ์ œ..! ์ธ๋ฐ ์ด์ œ ์ธํ’‹์„ ์—ฐ์†๋œ ์ˆ˜๋กœ ๋ฐ›๊ธฐ๋•Œ๋ฌธ์— char ๋กœ ๋ฐ›์•„์„œ int ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์—ฐ์‚ฐํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

 

2580๊ณผ ๋™์ผํ•˜๊ฒŒ ํ’€์—ˆ๋Š”๋ฐ ํ‹€๋ ธ๋‹ค๊ณ  ๋œจ๋Š” ๊ฒฝ์šฐ ์ถœ๋ ฅ ํ˜•์‹์„ ์ž์„ธํžˆ ๋ณด์ž !!

์ตœ์†Œ๊ฐ€ ๋˜๋Š” ํ•œ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์ถœ๋ ฅํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋นˆ ์นธ ์ค‘ ์•ž ์นธ๋ถ€ํ„ฐ ์ ์€ ์ˆ˜๋ถ€ํ„ฐ ๋„ฃ์–ด๊ฐ€๋ฉฐ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ•ด ๋‚˜๊ฐ€์•ผ ํ•œ๋‹ค.

๋‚˜์˜ ๊ฒฝ์šฐ ๋นˆ ์นธ์˜ ์œ„์น˜๋“ค์„ ๋ฒกํ„ฐ๋กœ ๊ด€๋ฆฌํ–ˆ์œผ๋‚˜ ์ด์ค‘ for๋ฌธ์œผ๋กœ ์•ž๋ถ€ํ„ฐ ๋’ค๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ๋Œ์•„๋„ ์ƒ๊ด€ ์—†๋‹ค (์‹œ๊ฐ„ ๋ณต์žก๋„..๊ฐ€ ์ข€ ์ปค์งˆ๋ฟ)

 

// 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;
          
    // ์ž…๋ ฅ
    char ch; int input;
    for(int i=0; i<9; i++) {
        for(int j=0; j<9; j++) {
            cin >> ch;
            input = (int)ch - '0';
            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;
}

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