๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 2630 ์ƒ‰์ข…์ด ๋งŒ๋“ค๊ธฐ

by ๐ŸŠ๊ทค๐ŸŠ 2024. 8. 5.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/2630

  • ์•„๋ž˜ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ •์‚ฌ๊ฐํ˜•์นธ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘์˜ ์ข…์ด๊ฐ€ ์ฃผ์–ด์ ธ ์žˆ๊ณ , ๊ฐ ์ •์‚ฌ๊ฐํ˜•๋“ค์€ ํ•˜์–€์ƒ‰์œผ๋กœ ์น ํ•ด์ ธ ์žˆ๊ฑฐ๋‚˜ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ์น ํ•ด์ ธ ์žˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ์ข…์ด๋ฅผ ์ผ์ •ํ•œ ๊ทœ์น™์— ๋”ฐ๋ผ ์ž˜๋ผ์„œ ๋‹ค์–‘ํ•œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘์˜ ํ•˜์–€์ƒ‰ ๋˜๋Š” ํŒŒ๋ž€์ƒ‰ ์ƒ‰์ข…์ด๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค.
  • ์ „์ฒด ์ข…์ด์˜ ํฌ๊ธฐ๊ฐ€ N×N(N=2k, k๋Š” 1 ์ด์ƒ 7 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜) ์ด๋ผ๋ฉด ์ข…์ด๋ฅผ ์ž๋ฅด๋Š” ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  • ์œ„์™€ ๊ฐ™์€ ๊ทœ์น™์— ๋”ฐ๋ผ ์ž˜๋ž์„ ๋•Œ <๊ทธ๋ฆผ 3>์€ <๊ทธ๋ฆผ 1>์˜ ์ข…์ด๋ฅผ ์ฒ˜์Œ ๋‚˜๋ˆˆ ํ›„์˜ ์ƒํƒœ๋ฅผ, <๊ทธ๋ฆผ 4>๋Š” ๋‘ ๋ฒˆ์งธ ๋‚˜๋ˆˆ ํ›„์˜ ์ƒํƒœ๋ฅผ, <๊ทธ๋ฆผ 5>๋Š” ์ตœ์ข…์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ 9์žฅ์˜ ํ•˜์–€์ƒ‰ ์ƒ‰์ข…์ด์™€ 7์žฅ์˜ ํŒŒ๋ž€์ƒ‰ ์ƒ‰์ข…์ด๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค.
  • ์ „์ฒด ์ข…์ด๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์น ํ•ด์ ธ ์žˆ์ง€ ์•Š์œผ๋ฉด ๊ฐ€๋กœ์™€ ์„ธ๋กœ๋กœ ์ค‘๊ฐ„ ๋ถ€๋ถ„์„ ์ž˜๋ผ์„œ <๊ทธ๋ฆผ 2>์˜ I, II, III, IV์™€ ๊ฐ™์ด ๋˜‘๊ฐ™์€ ํฌ๊ธฐ์˜ ๋„ค ๊ฐœ์˜ N/2 × N/2์ƒ‰์ข…์ด๋กœ ๋‚˜๋ˆˆ๋‹ค.
  • ๋‚˜๋ˆ„์–ด์ง„ ์ข…์ด I, II, III, IV ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ๋„ ์•ž์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋‘ ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์น ํ•ด์ ธ ์žˆ์ง€ ์•Š์œผ๋ฉด ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋˜‘๊ฐ™์€ ํฌ๊ธฐ์˜ ๋„ค ๊ฐœ์˜ ์ƒ‰์ข…์ด๋กœ ๋‚˜๋ˆˆ๋‹ค.
  • ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ์ž˜๋ผ์ง„ ์ข…์ด๊ฐ€ ๋ชจ๋‘ ํ•˜์–€์ƒ‰ ๋˜๋Š” ๋ชจ๋‘ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ์น ํ•ด์ ธ ์žˆ๊ฑฐ๋‚˜, ํ•˜๋‚˜์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์ด ๋˜์–ด ๋” ์ด์ƒ ์ž๋ฅผ ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์ข…์ด์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด N๊ณผ ๊ฐ ์ •์‚ฌ๊ฐํ˜•์นธ์˜ ์ƒ‰(ํ•˜์–€์ƒ‰ ๋˜๋Š” ํŒŒ๋ž€์ƒ‰)์ด ์ฃผ์–ด์งˆ ๋•Œ ์ž˜๋ผ์ง„ ํ•˜์–€์ƒ‰ ์ƒ‰์ข…์ด์™€ ํŒŒ๋ž€์ƒ‰ ์ƒ‰์ข…์ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
  • ์ฒซ์งธ ์ค„์—๋Š” ์ „์ฒด ์ข…์ด์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด N์ด ์ฃผ์–ด์ ธ ์žˆ๋‹ค. N์€ 2, 4, 8, 16, 32, 64, 128 ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • ์ƒ‰์ข…์ด์˜ ๊ฐ ๊ฐ€๋กœ์ค„์˜ ์ •์‚ฌ๊ฐํ˜•์นธ๋“ค์˜ ์ƒ‰์ด ์œ—์ค„๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ค„๊นŒ์ง€ ์ฃผ์–ด์ง„๋‹ค.
  • ํ•˜์–€์ƒ‰์œผ๋กœ ์น ํ•ด์ง„ ์นธ์€ 0, ํŒŒ๋ž€์ƒ‰์œผ๋กœ ์น ํ•ด์ง„ ์นธ์€ 1๋กœ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ˆซ์ž ์‚ฌ์ด์—๋Š” ๋นˆ์นธ์ด ํ•˜๋‚˜์”ฉ ์žˆ๋‹ค.
  • ์ฒซ์งธ ์ค„์—๋Š” ์ž˜๋ผ์ง„ ํ–์–€์ƒ‰ ์ƒ‰์ข…์ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๋‘˜์งธ ์ค„์—๋Š” ํŒŒ๋ž€์ƒ‰ ์ƒ‰์ข…์ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์•„์ด๋””์–ด

  • ์—ด๊ณผ ํ–‰์˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ๋์ ๊นŒ์ง€ ์‚ฌ์ด์ฆˆ๋งŒํผ ๋Œ์•˜์„ ๋•Œ, ์‹œ์ž‘์ ๊ณผ ํ•ด๋‹น ์ง€์ ์˜ ๊ฐ’์ด ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด ํ•ด๋‹น ์œ„์น˜์˜ ํ•ด๋‹น ์‚ฌ์ด์ฆˆ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์ƒ‰์ข…์ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ ์—ด์˜ ์‹œ์ž‘์ ๊ณผ ํ–‰์˜ ์‹œ์ž‘์ ์„ ํ•จ์ˆ˜ ๊ธฐ์ค€์œผ๋กœ 1์‚ฌ๋ถ„๋ฉด, 2์‚ฌ๋ถ„๋ฉด, 3์‚ฌ๋ถ„๋ฉด, 4์‚ฌ๋ถ„๋ฉด ์‹œ์ž‘์  ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์›๋ž˜ ์‚ฌ์ด์ฆˆ๋ฅผ 2๋ถ„์˜ 1๋‚ธ ํฌ๊ธฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ DFS๋ฅผ ๋Œ๋ฆฐ๋‹ค.
  • ๋งŒ์•ฝ ํ•ด๋‹น ํฌ๊ธฐ๋กœ ์ƒ‰์ข…์ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ฒซ ์‹œ์ž‘ ์ง€์ ์˜ ๊ฐ’์„ ํŒ๋‹จํ•ด์„œ ํŒŒ๋ž€์ƒ‰์ธ์ง€ ํฐ์ƒ‰์ธ์ง€ ๊ตฌ๋ถ„ํ•˜์—ฌ ์นด์šดํŠธ ํ•˜๊ณ  returnํ•œ๋‹ค.

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • ํ‘ธ๋Š”๋ฐ ์ž๊พธ stackoverflow๊ฐ€ ๋‚˜์„œ ๋ญ๊ฐ€ ๋ฌธ์  ์ง€ ๊ณ„์† ๊ณ ๋ฏผํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
  • DFS๋ฅผ ๋Œ๋ฆด ๋•Œ ๊ธฐ์ €์กฐ๊ฑด์„ ๋ช…ํ™•ํžˆ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š์•„ ๋ฌดํ•œ DFS ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์—ฌ stackoverflow๊ฐ€ ๋‚ฌ๋˜ ๊ฒƒ์ด์˜€๋‹ค.
  • ์•ž์œผ๋กœ ๊ธฐ์ €์กฐ๊ฑด์„ ์ข€ ๋” ๊ผผ๊ผผํžˆ ์„ค์ •ํ•˜์—ฌ์•ผ๊ฒ ๋‹ค...

๊ธฐ์ € ์กฐ๊ฑด ์ž˜ ์„ค์ •ํ•˜๊ธฐ...!

์ฝ”๋“œ

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

public class BOJ2630 {

    static int N;

    static int paper[][];

    static int b_cnt;
    static int w_cnt;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // ํ•œ ๋ณ€์˜ ๊ธธ์ด
        N = Integer.parseInt(br.readLine());

        // ์ƒ‰์ข…์ด๊ฐ€ ์น ํ•ด์ง„ ๋ชจ์–‘
        paper = new int[N][N];

        // ํŒŒ๋ž€์ƒ‰ ์ข…์ด ์นด์šดํŠธ
        b_cnt = 0;

        // ํ•˜์–€์ƒ‰ ์ข…์ด ์นด์šดํŠธ
        w_cnt = 0;

        for(int i = 0; i < N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());

            for(int j = 0; j < N; j++){
                int n = Integer.parseInt(st.nextToken());

                // ์ข…์ด์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด  ์— ์ข…์ด์ƒ‰ ์ €์žฅ
                paper[i][j] = n;
            }
        }

        DFS(0, 0, N);

        System.out.println(w_cnt);
        System.out.println(b_cnt);
    }


    static public void DFS(int l, int k, int S){
        // ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์ž๋ฅผ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ ํŒ๋‹จ ๋ณ€์ˆ˜
        boolean TF = true;

        for(int i = l; i < l + S; i++){
            for(int j = k; j < k + S; j++){
                // ๋งŒ์•ฝ ์ข…์ด์˜ ์‹œ์ž‘๋ถ€๋ถ„๊ณผ ํ•ด๋‹น ๋ถ€๋ถ„์˜ ๊ฐ’์ด ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด
                if(paper[i][j] != paper[l][k]){
                    // ํ•ด๋‹น ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์€ ํฐ์ƒ‰, ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๋‚˜๋‰˜์ง€ ์•Š๋Š”๋‹ค๋Š”
                    // ๋œป์ด๋ฏ€๋กœ false๋กœ ๋ฐ”๊พธ๊ณ  ๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ
                    TF = false;
                    break;
                }
            }
            if(!TF){
                break;
            }
        }
        // ๋งŒ์•ฝ ํ•ด๋‹น ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์„ ํ•œ ์ƒ‰๊น”๋กœ ์น ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด
        // ํ•ด๋‹น ์ •์‚ฌ๊ฐํ˜•์˜ ์‹œ์ž‘๋ถ€๋ถ„์˜ ์ˆซ์ž๋ฅผ ํ™•์ธ ํ›„,
        // ํฐ์ƒ‰์ด๋‚˜ ํŒŒ๋ž€์ƒ‰ ์นด์šดํŠธ + 1
        if(TF){
            // ์ˆซ์ž๊ฐ€ 1์ด๋ผ๋ฉด ํŒŒ๋ž€์ƒ‰ + 1
            if(paper[l][k] == 1){
                b_cnt = b_cnt + 1;
            }
            // ์ˆซ์ž๊ฐ€ 0์ด๋ผ๋ฉด ํฐ์ƒ‰ + 1
            else if(paper[l][k] == 0){
                w_cnt = w_cnt + 1;
            }
        }
        // ํ•ด๋‹น ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์ž๋ฅผ ์ˆ˜ ์—†๋‹ค๋ฉด 2๋ถ„์˜ 1๊ธธ์ด๋กœ ์ž˜๋ผ์„œ
        // ๋‹ค์‹œ DFS๋ฅผ ๋Œ๋ฆผ
        else if(!TF){
            int newS = S / 2;
            // 2์‚ฌ๋ถ„๋ฉด
            DFS(l, k, newS);
            // 1์‚ฌ๋ถ„๋ฉด
            DFS(l, k + newS, newS);
            // 3์‚ฌ๋ถ„๋ฉด
            DFS(l + newS, k, newS);
            // 4์‚ฌ๋ถ„๋ฉด
            DFS(l + newS, k + newS, newS);
        }
    }
}