๊ธฐ๋ก๋ฐฉ

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

CodingTest/Java

BOJ_2239 : ์Šค๋„์ฟ 

Soom_1n 2023. 4. 6. 17:16

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

 

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

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

www.acmicpc.net



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

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

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    private static int[][] map;

    private static boolean recu(int n) {
        if (n == 81) return true;

        int r = n / 9;
        int c = n % 9;

        if (map[r][c] != 0) return recu(n + 1);
        else {
            boolean[] used = new boolean[10];

            for (int k = 0; k < 9; k++) {
                used[map[r][k]] = true; // check row
                used[map[k][c]] = true; // check col
            }

            // check 3x3
            int x = r / 3 * 3;
            int y = c / 3 * 3;
            for (int k = x; k < x + 3; k++) {
                for (int l = y; l < y + 3; l++) {
                    used[map[k][l]] = true;
                }
            }

            for (int k = 1; k <= 9; k++) {
                if (!used[k]) {
                    map[r][c] = k;
                    if (recu(n+1)) return true;
                }
            }
            map[r][c] = 0;
            return false;
        }
    }

    public static void main(String[] args) throws IOException {
        // Input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        map = new int[9][9];
        for (int i = 0; i < 9; i++) {
            String[] ss = br.readLine().split("");
            for (int j = 0; j < 9; j++) {
                map[i][j] = Integer.parseInt(ss[j]);
            }
        }

        // Sudoku
        recu(0);

        // Output
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                sb.append(map[i][j]);
            }
            sb.append('\n');
        }
        System.out.print(sb);
    }
}

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

  • ์žฌ๊ท€ ๋ฉ”์„œ๋“œ recu๋ฅผ ํ†ตํ•ด ์Šค๋„์ฟ ๋ฅผ ์ฑ„์›Œ ๋‚˜๊ฐ„๋‹ค.
    • 81์นธ์„ ๋ชจ๋‘ ์ฑ„์šฐ๋ฉด ์„ฑ๊ณต์ด๋ฏ€๋กœ ์žฌ๊ท€๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค. (true ๋ฆฌํ„ด)
    • ์Šค๋„์ฟ  ํŒ์—์„œ ํ–‰๊ณผ ์—ด์„ n์˜ ๋ชฉ๊ณผ ๋‚˜๋จธ์ง€๋กœ ์ ‘๊ทผํ•œ๋‹ค.
      • ์ด๋ฏธ ๊ฐ’์ด ์ฑ„์›Œ์ ธ ์žˆ์œผ๋ฉด ๋‹ค์Œ ์นธ์„ ํ™•์ธํ•œ๋‹ค.
    • ์ฑ„์›Œ์ ธ ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๊ฐ€๋กœ/์„ธ๋กœ/3x3์„ ํ™•์ธํ•ด์„œ ๋“ฑ์žฅํ•œ ์ˆซ์ž๋ฅผ used ๋ฐฐ์—ด์— ์ธ๋ฑ์Šค๋กœ true๋ฅผ ์ €์žฅํ•œ๋‹ค.
    • ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ž‘์€ ์ˆœ์œผ๋กœ ๋„ฃ์–ด๋ณด๊ณ  ์žฌ๊ท€๋กœ ๋„˜๊ธด๋‹ค.
      • ๋งŒ์•ฝ ์„ฑ๊ณตํ–ˆ์œผ๋ฉด ์ข…๋ฃŒ, ์‹คํŒจํ•˜๋ฉด ๋‹ค์Œ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
  • ์žฌ๊ท€ ์ข…๋ฃŒ ํ›„ ์Šค๋„์ฟ ํŒ์„ ์ถœ๋ ฅํ•œ๋‹ค.
    • ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์ฒ˜์Œ์—” ๊ทธ๋ฆฌ๋””๋กœ ์ ‘๊ทผํ•ด์„œ ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ•œ 0์ธ ๋ถ€๋ถ„๋“ค์ด ๋ถ€๋ถ„๋ถ€๋ถ„ ๋‚˜ํƒ€๋‚ฌ๋‹ค.
    • ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ ๋ฐฑํŠธ๋ž˜ํ‚น์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

728x90

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

BOJ_14890 : ๊ฒฝ์‚ฌ๋กœ  (0) 2023.04.07
BOJ_13459 : ๊ตฌ์Šฌ ํƒˆ์ถœ  (0) 2023.04.06
BOJ_17141 : ์—ฐ๊ตฌ์†Œ 2  (0) 2023.04.06
BOJ_2636 : ์น˜์ฆˆ  (0) 2023.04.06
BOJ_1600 : ๋ง์ด ๋˜๊ณ ํ”ˆ ์›์ˆญ์ด  (0) 2023.04.06