๐ŸŽฏ Coding Test

[๋ฐฑ์ค€] 2630๋ฒˆ ์ƒ‰์ข…์ด ๋งŒ๋“ค๊ธฐ ์ž๋ฐ” (๋ถ„ํ• ์ •๋ณต)

์—ฐ_์šฐ๋ฆฌ 2022. 2. 22. 15:22
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

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

     

    2630๋ฒˆ: ์ƒ‰์ข…์ด ๋งŒ๋“ค๊ธฐ

    ์ฒซ์งธ ์ค„์—๋Š” ์ „์ฒด ์ข…์ด์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด N์ด ์ฃผ์–ด์ ธ ์žˆ๋‹ค. N์€ 2, 4, 8, 16, 32, 64, 128 ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ƒ‰์ข…์ด์˜ ๊ฐ ๊ฐ€๋กœ์ค„์˜ ์ •์‚ฌ๊ฐํ˜•์นธ๋“ค์˜ ์ƒ‰์ด ์œ—์ค„๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ค„๊นŒ์ง€ ์ฃผ์–ด์ง„๋‹ค.

    www.acmicpc.net

     

     

     

     

    ๋ฌธ์ œํ’€์ด

    ๋ถ„ํ• ์ •๋ณต์€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

    ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ํ•˜์œ„๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ „์ฒด์— ํ•ฉ์น˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

     

     

    1๋ฒˆ์งธ๋Š” ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ 2์ค‘ for๋ฌธ์„ ๋Œ๋ ค ์ƒ‰์„ ํŒ๋‹จํ•œ๋‹ค.

     => ๋ชจ๋‘ ๊ฐ™๋‹ค๋ฉด ์ƒ‰๊น”์— ๋งž๊ฒŒ ์ €์žฅ

     => ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅธ ์ƒ‰๊น”์ด ์žˆ๋‹ค๋ฉด 4๋ถ„ํ• 

          ์ขŒ์ธก์ƒ๋‹จ : x๋Š” 0~4๊นŒ์ง€, y๋Š” 0~4๊นŒ์ง€ ํƒ์ƒ‰

          ์ขŒ์ธกํ•˜๋‹จ : x๋Š” 0~4๊นŒ์ง€, y๋Š” 4~8๊นŒ์ง€ ํƒ์ƒ‰

          ์šฐ์ธก์ƒ๋‹จ : x๋Š” 4~8๊นŒ์ง€, y๋Š” 0~4๊นŒ์ง€ ํƒ์ƒ‰

          ์šฐ์ธกํ•˜๋‹จ : x๋Š” 4~8๊นŒ์ง€, y๋Š” 4~8๊นŒ์ง€ ํƒ์ƒ‰

     

    2๋ฒˆ์งธ๋Š” x๋Š” 0~4๊นŒ์ง€, y๋Š” 0~4๊นŒ์ง€๋ฅผ ๋Œ€์ƒ์œผ๋กœ 2์ค‘ for๋ฌธ์„ ๋Œ๋ ค ์ƒ‰์„ ํŒ๋‹จํ•œ๋‹ค.

     => ๋ชจ๋‘ ๊ฐ™๋‹ค๋ฉด ์ƒ‰๊น”์— ๋งž๊ฒŒ ์ €์žฅ

     => ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅธ ์ƒ‰๊น”์ด ์žˆ๋‹ค๋ฉด 4๋ถ„ํ•  ... ๋ฐ˜๋ณต

     

     

    ํƒ์ƒ‰๋ฒ”์œ„๋งŒ ๋ฐ”๋€” ๋ฟ ์ƒ‰์„ ํŒ๋‹จํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๊ฐ™๊ธฐ๋•Œ๋ฌธ์— colorCheck ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

     

    colorCheck๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ƒ‰์ด ๋ชจ๋‘ ๊ฐ™๋‹ค๋ฉด white์™€ blue๋ฅผ +1๋งŒํผ ์ฆ๊ฐ€ํ•ด์•ผํ•œ๋‹ค.

    colorCheck๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ƒ‰์ด ๋‹ค๋ฅด๋‹ค๋ฉด ์ขŒํ‘œ๋ฅผ 4๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด์•ผํ•œ๋‹ค.

     => ์ƒ‰์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ขŒํ‘œ๋ฒ”์œ„๋ฅผ ๋‚˜๋ˆ„๊ณ 

          ๋‚˜๋‰˜์–ด์ง„ ์ขŒํ‘œ๋ฒ”์œ„์—์„œ ์ƒ‰์ด ๊ฐ™์•„์ง€๋ฉด, white์™€ blue์˜ ๊ฐœ์ˆ˜๋ฅผ ์ „์ฒด์ ์œผ๋กœ ํ•ฉ์ณ์•ผํ•œ๋‹ค.

          ๋”ฐ๋ผ์„œ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

     

     

    ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋Š” ํ’€์ด

    ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ์ค„์”ฉ ์ฝ์œผ๋ฉด๋œ๋‹ค..!

    colorCheck์˜ for-row, for-col์€ ์ฃผ์–ด์ง„ x์™€ y์˜ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

     

     

     

     

    ์ œ์ถœ์ฝ”๋“œ

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    public class Main {
    
        static int white = 0;
        static int blue = 0;
        static int[][] board;
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int N = Integer.parseInt(br.readLine());
            StringTokenizer st;
    
            board = new int[N][N];
            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine(), " ");
                for (int j = 0; j < N; j++) {
                     int num = Integer.parseInt(st.nextToken());
                     board[i][j] = num;
                }
            }
            //===============================
            //์ž…๋ ฅ๊ฐ’ ์ €์žฅ
    
            partition(0, 0, N);
            //์ƒ‰์ƒ ํŒ๋‹จํ•  ์‹œ์ž‘์ ์ž…๋ ฅ
            System.out.println(white);
            System.out.println(blue);
        }
    
        private static void partition(int row, int col, int size) {
            //์ƒ‰์ƒ ๋ชจ๋‘ ๊ฐ™์€์ง€ ํ™•์ธ. 
            if(colorCheck(row, col, size)){	
                //์ƒ‰์ƒ์ด ๋ชจ๋‘ ๊ฐ™๋‹ค๋ฉด ์‹คํ–‰
                if(board[row][col] == 0){	
                    white++;
                }else{
                    blue++;
                }
                return;
            }
    
            //์ƒ‰์ƒ์ด ๋ชจ๋‘ ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด ๋ถ„ํ• 
            int newSize = size / 2;
            partition(row, col, newSize);                   //์ขŒ์ธก์ƒ๋‹จ
            partition(row, col+newSize, newSize);           //์ขŒ์ธกํ•˜๋‹จ
            partition(row+newSize, col, newSize);           //์šฐ์ธก์ƒ๋‹จ
            partition(row+newSize, col+newSize, newSize); 	//์šฐ์ธกํ•˜๋‹จ
        }
    
        private static boolean colorCheck(int row, int col, int size) {
            int color = board[row][col];	// ๊ธฐ์ค€ Color
    
            for(int i = row; i < row + size; i++) {
                for(int j = col; j < col + size; j++) {
                    // ์ƒ‰์ƒ ๊ฐ™์ง€์•Š์œผ๋ฉด false
                    if(board[i][j] != color) {
                        return false;
                    }
                }
            }
            // ์ƒ‰์ƒ ๋ชจ๋‘ ๊ฐ™์œผ๋ฉด true
            return true;
        }
    
    }

     

     

     

     

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ