๐ŸŽฏ Coding Test

[๋ฐฑ์ค€] 1074๋ฒˆ Z ์ž๋ฐ” (๋ถ„ํ• ์ •๋ณต)

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

๋ชฉ์ฐจ

     

     

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

     

    1074๋ฒˆ: Z

    ํ•œ์ˆ˜๋Š” ํฌ๊ธฐ๊ฐ€ 2N × 2N์ธ 2์ฐจ์› ๋ฐฐ์—ด์„ Z๋ชจ์–‘์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2×2๋ฐฐ์—ด์„ ์™ผ์ชฝ ์œ„์นธ, ์˜ค๋ฅธ์ชฝ ์œ„์นธ, ์™ผ์ชฝ ์•„๋ž˜์นธ, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์นธ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉด Z๋ชจ์–‘์ด๋‹ค. N > 1์ธ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์„

    www.acmicpc.net

     

     

     

    ๋ฌธ์ œํ’€์ด

    ์‹œ๊ฐ„์ดˆ๊ณผ

    ๋ณด๋“œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ 4๋“ฑ๋ถ„ํ•˜์—ฌ Z ๋ชจ์–‘์œผ๋กœ ์ฝ์–ด์•ผํ•œ๋‹ค.

    ๋ถ„ํ• ์ •๋ณต์„ ์ƒ๊ฐํ•ด์„œ ํ’€์—ˆ์ง€๋งŒ.. ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    ํžˆํžˆ ๋‚ด ์‚ฝ์งˆ..

     

    ํƒ์ƒ‰ ๋ฒ”์œ„ ์ขํžˆ๊ธฐ

    ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด์ž

    61์„ ์ฐพ์œผ๋ ค๋ฉด ๊ตณ์ด ๋ชจ๋“  ๋ถ€๋ถ„์„ ํƒ์ƒ‰ํ•ด์•ผํ• ๊นŒ?

    ์•„๋‹ˆ๋‹ค. 4๋“ฑ๋ถ„ํ•œ ์šฐ์ธกํ•˜๋‹จ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๊ณ 

    ๋‹ค์‹œ ์šฐ์ธกํ•˜๋‹จ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ์ขํ˜€์„œ Z ํƒ์ƒ‰ํ•˜๋ฉด๋œ๋‹ค.

     

     

    ๊ทธ๋Ÿผ 61(6, 7)์ด ์šฐ์ธกํ•˜๋‹จ์— ์œ„์น˜ํ•˜๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์ฐพ์•„๋‚ด๋ฉด๋ ๊นŒ?

    N์ด 8์ผ๋•Œ 

      X   Y
    ์™ผ์ชฝ 0~3 ์œ„ 0~3
    ์˜ค๋ฅธ์ชฝ 4~7 ์•„๋ž˜ 4~7

    ์™ผ์ชฝ์€ X๊ฐ€ 0~3๊นŒ์ง€, ์˜ค๋ฅธ์ชฝ์€ X๊ฐ€ 4~7๊นŒ์ง€์ด๋‹ค.

    ์œ„๋Š” Y๊ฐ€ 0~3๊นŒ์ง€, ์•„๋ž˜๋Š” Y๊ฐ€ 4~7๊นŒ์ง€์ด๋‹ค.

     

    61์˜ X์ธ 6์€ 4~7์— ํ•ด๋‹นํ•˜๋‹ˆ ์˜ค๋ฅธ์ชฝ

    61์˜ Y์ธ 7์€ 4~7์— ํ•ด๋‹นํ•˜๋‹ˆ ์•„๋ž˜์— ํ•ด๋‹น๋œ๋‹ค.

    =============================================================

    N์ด 4์ผ๋•Œ

      X   Y
    ์™ผ์ชฝ 4~5 ์œ„ 4~5
    ์˜ค๋ฅธ์ชฝ 6~7 ์•„๋ž˜ 6~7

    ์™ผ์ชฝ์€ X๊ฐ€ 4~5๊นŒ์ง€, ์˜ค๋ฅธ์ชฝ์€ X๊ฐ€ 6~7๊นŒ์ง€์ด๋‹ค.

    ์œ„๋Š” Y๊ฐ€ 4~5๊นŒ์ง€, ์•„๋ž˜๋Š” Y๊ฐ€ 6~7๊นŒ์ง€์ด๋‹ค.

     

    61์˜ X์ธ 6์€ 6~7์— ํ•ด๋‹นํ•˜๋‹ˆ ์˜ค๋ฅธ์ชฝ

    61์˜ Y์ธ 7์€ 6~7์— ํ•ด๋‹นํ•˜๋‹ˆ ์•„๋ž˜์— ํ•ด๋‹น๋œ๋‹ค.

    =============================================================

    N์ด 2์ผ๋•Œ๋Š” Z ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. Zํƒ์ƒ‰ ํ•˜๋ฉด์„œ๋Š” +1์”ฉ ์ฆ๊ฐ€ํ• ๊ฒƒ์ด๊ณ ,

    (6, 7)์„ ํƒ์ƒ‰ํ•  ๋•Œ count๊ฐ€ 61์ด ๋˜๋ ค๋ฉด

     

    N์ด 2์ธ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— count๊ฐ€ 60์ด ๋˜์–ด์žˆ์–ด์•ผํ•œ๋‹ค!!!!

     

     

     

    4๊ฐํ˜•์˜ ์ฒซ๋ฒˆ์งธ ๊ฐ’ ํŒŒ์•…ํ•˜๊ธฐ

    count๋ฅผ ์•Œ์•„๋‚ด๋ ค๋ฉด ์ชผ๊ฐœ์ง„ ๋ฒ”์œ„์˜ ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ํŒŒ์•…ํ•˜๋ฉด๋œ๋‹ค.

     

    N์ด 8์ผ๋•Œ 4๋“ฑ๋ถ„ํ•˜๋ฉด Half๋Š” 4( 8/2 = 4 ), ๊ฐ ์ฒซ๋ฒˆ์งธ ์‹œ์ž‘๊ฐ’์€ [0, 16, 32, 48] ์ด๋‹ค.

    0 = (4 * 4) * 0

    16 = (4 * 4) * 1

    32 = (4 * 4) * 2

    48 = (4 * 4) * 3

    ....

     

     

    N์ด 4์ผ๋•Œ 4๋“ฑ๋ถ„ํ•˜๋ฉด Half๋Š” 2( 4/2 = 2 ), ๊ฐ ์ฒซ๋ฒˆ์งธ ์‹œ์ž‘๊ฐ’์€ [0, 4, 8, 12, 16, 20, 24, 28....] ์ด๋‹ค.

    0 = (2 * 2) * 0

    4 = (2 * 2) * 1

    8 = (2 * 2) * 2

    12 = (2 * 2) * 3

    ....

     

     

    ๊ทœ์น™๋„ ์ฐพ์•˜์œผ๋‹ˆ ์ด์ œ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด๋ณด์ž

     

     

    ์ œ์ถœ์ฝ”๋“œ

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
    
        static int count  = 0;
        static int findX;
        static int findY;
        static boolean find = false;
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st  = new StringTokenizer(br.readLine(), " ");
            int N = Integer.parseInt(st.nextToken());
            findY = Integer.parseInt(st.nextToken());       //์—ดโญโญโญ
            findX = Integer.parseInt(st.nextToken());       //ํ–‰โญโญโญ
            int size = (int) Math.pow(2, N);
            //===============================
            //์ž…๋ ฅ์™„๋ฃŒ
    
            partition(0, 0, size);
            System.out.println(count-1);	//-1 โญโญโญ
        }
    
        private static void partition(int startX, int startY, int size) {
            if(size <= 2){
                findXY(startX, startY);
                return;
            }
    
            int half = size/2;
            boolean left =          startX <= findX && findX < startX + half;
            boolean right =  startX + half <= findX && findX < startX + size;
            boolean top =           startY <= findY && findY < startY + half;
            boolean bottom = startY + half <= findY && findY < startY + size;
    
    
            if(left && top){
                partition(startX, startY, half);
                
            }else if(right && top){
                count = count + ((half * half) * 1);
                partition(startX+half, startY, half);
                
            }else if(left && bottom){
                count = count + ((half * half) * 2);
                partition(startX, startY+half, half);
                
            }else if(right && bottom){
                count = count + ((half * half) * 3);
                partition(startX+half, startY+half, half);
            }
    
        }
    
    
        private static boolean findXY(int startX, int startY){
    
            //Z ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์ธ
            for (int j = startY; j < startY + 2; j++) {     //Y๊ฐ€ ๋จผ์ €
                for (int i = startX; i < startX+2; i++) {
                    count++;
                    if (i == findX && j == findY) {
                        return true;
                    }
                }
            }
    
            return false;
        }
    
    }

     

     

     

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