๊ธฐ๋ก๋ฐฉ

BOJ_2580 : ์Šค๋„์ฟ  ๋ณธ๋ฌธ

CodingTest/Java

BOJ_2580 : ์Šค๋„์ฟ 

Soom_1n 2024. 4. 19. 16:43

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

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

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

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • 9x9 ์Šค๋„์ฟ  ๋ฌธ์ œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด, ๋นˆ์นธ์„ ์ฑ„์›Œ์„œ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๐Ÿ”ธ ๋ฌธ์ œ ํ’€์ด ๐Ÿ”ธ

  • ์Šค๋„์ฟ  ๊ทœ์น™์— ๋”ฐ๋ผ ๊ฐ€๋กœ, ์„ธ๋กœ, ์ •์‚ฌ๊ฐํ˜•์— ๊ฒน์น˜๋Š” ์ˆซ์ž๊ฐ€ ์—†๋„๋ก ์ˆซ์ž๋ฅผ ์ฑ„์›Œ๊ฐ€์•ผ ํ•œ๋‹ค.
  • ๋งŒ์•ฝ ์ˆซ์ž๋ฅผ ๋†“์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋ฉด, ์ง์ „์— ๋†จ๋˜ ์ˆซ์ž๋ฅผ ์ทจ์†Œํ•˜๊ณ  ๋‹ค์‹œ ๋†“์•„ ๋ณด์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑํŠธ๋ž˜ํ‚น์ด ํ•„์š”ํ•˜๋‹ค.
    • ๋ฐฑํŠธ๋ž˜ํ‚น์—์„œ ๊ฐ€๋กœ, ์„ธ๋กœ, ์ •์‚ฌ๊ฐํ˜•์— ๊ฒน์น˜๋Š” ์ˆซ์ž๊ฐ€ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ƒํƒœ ์ •๋ณด๋„ ํ•„์š”ํ•˜๋‹ค.
  • ์ˆซ์ž๋ฅผ ์ฑ„์›Œ๊ฐ€๋ฉฐ ๋งˆ์ง€๋ง‰ ์นธ๊นŒ์ง€ ์ฑ„์šฐ๋Š”๋ฐ ์„ฑ๊ณตํ•˜๋ฉด, ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    private static final int size = 9;
    private static int[][] sdoku;
    private static boolean[][] row, col, square;

    private static int getSquare(int row, int col) {
        return (row / 3 * 3 + col / 3);
    }

    private static boolean game(int z) {
        if (z == 81) {
            return true;
        }

        int r = z / size;
        int c = z % size;

        if (sdoku[r][c] != 0) {
            return game(z + 1);
        } else {
            for (int i = 1; i <= 9; i++) {
                if (!row[r][i] && !col[c][i] && !square[getSquare(r, c)][i]) {
                    row[r][i] = col[c][i] = square[getSquare(r, c)][i] = true;
                    sdoku[r][c] = i;
                    if (game(z + 1)) {
                        return true;
                    }
                    sdoku[r][c] = 0;
                    row[r][i] = col[c][i] = square[getSquare(r, c)][i] = false;
                }
            }
        }
        return false;
    }

    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = null;

        sdoku = new int[size][size];        // ์Šค๋„์ฟ ์— ์ ํžŒ ์ˆซ์ž
        row = new boolean[size][size + 1];      // ํ–‰์— ๋‚˜์˜จ ์ˆซ์ž ํ™•์ธ
        col = new boolean[size][size + 1];      // ์—ด์— ๋‚˜์˜จ ์ˆซ์ž ํ™•์ธ
        square = new boolean[size][size + 1];   // ์ •์‚ฌ๊ฐํ˜•์— ๋‚˜์˜จ ์ˆซ์ž ํ™•์ธ

        for (int i = 0; i < size; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < size; j++) {
                sdoku[i][j] = Integer.parseInt(st.nextToken());
                row[i][sdoku[i][j]] = true;
                col[j][sdoku[i][j]] = true;
                square[getSquare(i, j)][sdoku[i][j]] = true;
            }
        }

        // ๋ฐฑํŠธ๋ž˜ํ‚น
        game(0);

        // Output
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                sb.append(sdoku[i][j]).append(' ');
            }
            sb.append('\n');
        }

        bw.write(sb.toString());
        bw.flush();
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ์Šค๋„์ฟ  ๊ฒŒ์ž„ํŒ ์ƒํƒœ๋ฅผ intํ˜• ์ด์ค‘๋ฐฐ์—ด sdoku์— ๊ธฐ๋กํ•ด๊ฐ€๋ฉฐ ํ’€์ดํ•œ๋‹ค.
  • ๊ฐ€๋กœ, ์„ธ๋กœ, ์ •์‚ฌ๊ฐํ˜•์— ๋‚˜ํƒ€๋‚œ ์ˆซ์ž๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด boolean ์ด์ค‘๋ฐฐ์—ด row, col, sqaure๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์žฌ๊ท€ ๋ฉ”์„œ๋“œ game() ์—์„œ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ†ตํ•ด ์Šค๋„์ฟ ๋ฅผ ํ”Œ๋ ˆ์ดํ•œ๋‹ค.
    • ์Šค๋„์ฟ  ์นธ์˜ ๋ฒˆํ˜ธ z๋ฅผ ๋„˜๊ฒจ 81๊ฐœ์˜ ์นธ์„ ๋ชจ๋‘ ์ฑ„์šฐ๋Š”๋ฐ ์„ฑ๊ณตํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • z๋ฅผ ์Šค๋„์ฟ  ํ•œ๋ณ€์˜ ๊ธธ์ด size๋กœ ๋‚˜๋ˆ„๊ฑฐ๋‚˜ ๋ชซ์„ ๊ตฌํ•ด ์ขŒํ‘œ๋ฅผ ๊ตฌํ•œ๋‹ค.
    • ๋งŒ์•ฝ ์ˆซ์ž๊ฐ€ ์ฑ„์›Œ์ ธ์žˆ์œผ๋ฉด ๋„˜์–ด๊ฐ€๊ณ , ๋นˆ์นธ(0)์ด๋ฉด 1๋ถ€ํ„ฐ 9๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ์ฑ„์›Œ๋ณธ๋‹ค.
      • ์ˆซ์ž๋ฅผ ์ฑ„์šธ ๋•Œ, ๊ฐ€๋กœ / ์„ธ๋กœ / ์ •์‚ฌ๊ฐํ˜•์— ๊ฒน์น˜๋Š” ์ˆซ์ž๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
      • ๋“ฑ์žฅํ•œ ์ˆซ์ž๋กœ ์ฒดํฌํ•ด์ฃผ๊ณ , z+1๋กœ game์„ ๋‹ค์‹œ ์žฌ๊ท€ํ•œ๋‹ค.
      • ๋งŒ์•ฝ ๋ชจ๋“  ํƒ์ƒ‰์— ์‹คํŒจํ–ˆ๋‹ค๋ฉด, ํ˜„์žฌ ์นธ์„ 0์œผ๋กœ ๋‹ค์‹œ ๋น„์›Œ์ฃผ๊ณ , ๋“ฑ์žฅํ•œ ์ˆซ์ž์—์„œ๋„ ์ง€์›Œ์ค€ ๋’ค false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • game() ๋ฉ”์„œ๋“œ์˜ ๋ชจ๋“  ์žฌ๊ท€๊ฐ€ ๋งˆ๋ฌด๋ฆฌ ๋œ ๋’ค, sdoku ๋ฐฐ์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ๋ฌธ์ œ ์„ค๋ช…์— 12095 : ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์Šค๋„์ฟ  ๋ฌธ์ œ์˜ ์†Œ์Šค๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค๊ธธ๋ž˜, ์ฐพ์•„๊ฐ€๋ณด๋‹ˆ ์ •๋‹ต ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ๋‹ค... ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ๋„ ์ „์— ์Šคํฌ๋‹นํ–ˆ๋Š”๋ฐ, ์ข‹์€ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ํด๋ก ์ฝ”๋”ฉ ํ•˜๋“ฏ ํ’€์ดํ•ด ๋ณด์•˜๋‹ค.
  • ํ’€์ด ์›๋ฆฌ ์ž์ฒด๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์„ ๊ตฌํ˜„ํ•˜๋Š”๊ฑฐ๋ผ ๊ฐ„๋‹จํ–ˆ๋‹ค. ์—ฐ๊ณ„๋˜๋Š” 12095 ๋ฌธ์ œ๋„ ๋‹ค์Œ์— ๊ผญ ํ’€์–ด๋ณด๋„๋ก ํ•˜์ž.

728x90

'CodingTest > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ_14499 : ์ฃผ์‚ฌ์œ„ ๊ตด๋ฆฌ๊ธฐ  (0) 2024.04.26
BOJ_1976 : ์—ฌํ–‰ ๊ฐ€์ž  (0) 2024.04.22
BOJ_1707 : ์ด๋ถ„ ๊ทธ๋ž˜ํ”„  (0) 2024.04.13
BOJ_3190 : ๋ฑ€  (0) 2024.04.11
BOJ_2143 : ๋‘ ๋ฐฐ์—ด์˜ ํ•ฉ  (0) 2024.04.10