์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[ BOJ / ๋ฐฑ์ค€ 20061 ] ๋ชจ๋…ธ๋ฏธ๋…ธ๋„๋ฏธ๋…ธ 2 ( ์ž๋ฐ” / JAVA )

KIMHYEYUN 2022. 2. 12. 23:33
๋ฐ˜์‘ํ˜•

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

 

20061๋ฒˆ: ๋ชจ๋…ธ๋ฏธ๋…ธ๋„๋ฏธ๋…ธ 2

๋ชจ๋…ธ๋ฏธ๋…ธ๋„๋ฏธ๋…ธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ๊ธด ๋ณด๋“œ์—์„œ ์ง„ํ–‰๋˜๋Š” ๊ฒŒ์ž„์ด๋‹ค. ๋ณด๋“œ๋Š” ๋นจ๊ฐ„์ƒ‰ ๋ณด๋“œ, ํŒŒ๋ž€์ƒ‰ ๋ณด๋“œ, ์ดˆ๋ก์ƒ‰ ๋ณด๋“œ๊ฐ€ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ถ™์–ด์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค. ๊ฒŒ์ž„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ขŒํ‘œ (x, y)์—์„œ x๋Š” ํ–‰,

www.acmicpc.net

๋ฌธ์ œ ์„ค๋ช…

์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋ก

๋ธ”๋ก์˜ ๋นจ๊ฐ„์ƒ‰ ๋ณด๋“œ์˜ ์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด, ์ดˆ๋ก์ƒ‰ ๋ณด๋“œ์™€ ํŒŒ๋ž€์ƒ‰ ๋ณด๋“œ๋กœ

1) ๋‹ค๋ฅธ ๋ธ”๋ก์„ ๋งŒ๋‚˜๊ฑฐ๋‚˜
2) ๋ณด๋“œ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€
์ด๋™

N๊ฐœ์˜ ๋ธ”๋ก๋“ค์ด ์ฃผ์–ด์ง
green → 6x4, blue → 4x6

  1. ๋ธ”๋ก์„ ์ด๋™
  • ๋งŒ์•ฝ ์ดˆ๋ก์ƒ‰ ๋ณด๋“œ๋Š” ํ•œ ํ–‰, ํŒŒ๋ž€์ƒ‰ ๋ณด๋“œ๋Š” ํ•œ ์—ด์ด ๋ธ”๋ก์œผ๋กœ ๋ชจ๋‘ ์ฑ„์›Œ์ง€๋ฉด
    • ๐Ÿ‘‰ ๊ทธ ๋ผ์ธ์˜ ํƒ€์ผ์€ ๋ชจ๋‘ ์ง€์›Œ์ง€๊ณ , ์ง€์›Œ์ง„ ๋ผ์ธ์˜ ์™ผ์ชฝ ๋ผ์ธ๋“ค์ด ๋ชจ๋‘ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
  • ๋งŒ์•ฝ ์ดˆ๋ก์ƒ‰ ๋ณด๋“œ๋Š” 0/1ํ–‰, ํŒŒ๋ž€์ƒ‰ ๋ณด๋“œ๋Š” 0/1์—ด → ์—ฐํ•œ์ƒ‰
    • ๐Ÿ‘‰ ๊ทธ ์นธ๋“ค์— ํƒ€์ผ์ด ๋“ค์–ด๊ฐ„๋‹ค๋ฉด, ํƒ€์ผ์ด ์žˆ๋Š” ๋ผ์ธ ์ˆ˜ ๋งŒํผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
  1. ํ•œ ํ–‰ ๋˜๋Š” ํ•œ ์—ด์˜ ๋ธ”๋ก์ด ๊ฐ€๋“์ฐจ์„œ ์ง€์›Œ์ง„๋‹ค๋ฉด, ์ ์ˆ˜ += 1
  • ๋ธ”๋ก ์ •๋ณด(t,x,y)
    • t == 1 : 1x1 ํƒ€์ผ, (x,y)
    • t == 2 : 1x2 ํƒ€์ผ, (x,y), (x,y+1)
    • t == 3 : 2x1 ํƒ€์ผ, (x,y), (x+1,y)

๋ฌธ์ œ ํ’€์ด

์ผ์ผ์ด ๊ตฌํ˜„ โ€ผ๏ธ

  1. moveToGreen, moveToBlue
    ๊ฐ๊ฐ ์ดˆ๋ก์ƒ‰ ๋ณด๋“œ, ํŒŒ๋ž€์ƒ‰ ๋ณด๋“œ๋กœ ์ด๋™ํ•˜๋Š” ํ•จ์ˆ˜
    ๋‹ค๋ฅธ ๋ธ”๋ก์ด๋‚˜ ๋ฐฐ์—ด์˜ ๋์„ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์ด๋™
  2. removeGreenRow, removeBlueCol
    ๊ฐ๊ฐ ์ดˆ๋ก์ƒ‰ ๋ณด๋“œ์˜ ๊ฝ‰์ฐฌ ํ–‰, ํŒŒ๋ž€์ƒ‰ ๋ณด๋“œ์˜ ๊ฝ‰์ฐฌ ์—ด ์ œ๊ฑฐ
    for๋ฌธ์œผ๋กœ ๋Œ๋ฉด์„œ ์ฒดํฌ ํ›„, ์‚ญ์ œ
  3. lightGreen, lightBlue
    ์—ฐํ•œ์ƒ‰ ์นธ์— ๋ธ”๋ก์ด ์กด์žฌํ•˜๋ฉด, ์ด๋™

์ฝ”๋“œ

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

public class Main_BOJ_20061_๋ชจ๋…ธ๋ฏธ๋…ธ๋„๋ฏธ๋…ธ_2 {

    static int N, t, x, y, score;
    static int[][] green, blue;

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

        green = new int[6][4];
        blue = new int[4][6];

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

            t = Integer.parseInt(stringTokenizer.nextToken());
            x = Integer.parseInt(stringTokenizer.nextToken());
            y = Integer.parseInt(stringTokenizer.nextToken());

//            System.out.println("i : " + i);

            moveToGreen(t, y);
            moveToBlue(t, x);

/*            System.out.println("MOVE");
            printGreen();
            System.out.println();
            printBlue();*/

            removeGreenRow();
            removeBlueCol();

/*            System.out.println("REMOVE");
            printGreen();
            System.out.println();
            printBlue();*/

            lightGreen();
            lightBlue();

/*            System.out.println("LIGHT");
            printGreen();
            System.out.println();
            printBlue();
            System.out.println();*/
        }

        int cntOfGreenBlock = countOfGreenBlock();
        int cntOfBlueBlock = countOfBlueBlock();

        System.out.println(score);
        System.out.println(cntOfBlueBlock + cntOfGreenBlock);
    }

    private static int countOfBlueBlock() {
        int cnt = 0;
        for (int[] bl : blue) {
            for (int b : bl) {
                if(b==1) cnt += 1;
            }
        }
        return cnt;
    }

    private static int countOfGreenBlock() {
        int cnt = 0;
        for (int[] gr : green) {
            for (int g : gr) {
                if(g == 1) cnt += 1;
            }
        }
        return cnt;
    }

    private static void lightBlue() {
        int cntOfBlockOfLight = 0;
        for (int j = 0; j < 2; j++) {
            for (int i = 0; i < 4; i++) {
                if (blue[i][j] == 1) {
                    cntOfBlockOfLight += 1;
                    break;
                }
            }
        }

        for (int k = 5; k >= 2; k--) {
            for (int i = 0; i < 4; i++) {
                blue[i][k] = blue[i][k - cntOfBlockOfLight];
            }
        }

        for (int j = 0; j < 2; j++) {
            for (int i = 0; i < 4; i++) {
                blue[i][j] = 0;
            }
        }
    }

    private static void lightGreen() {
        int cntOfBlockOfLight = 0;
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 4; j++) {
                if (green[i][j] == 1) {
                    cntOfBlockOfLight += 1;
                    break;
                }
            }
        }

        for (int k = 5; k >= 2; k--) {
            for (int j = 0; j < 4; j++) {
                green[k][j] = green[k - cntOfBlockOfLight][j];
            }
        }
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 4; j++) {
                green[i][j] = 0;
            }
        }
    }

    private static void removeBlueCol() {
        while (true) {
            boolean flag = true;
            for (int j = 0; j < 6; j++) {
                int cntOfBlock = 0;
                for (int i = 0; i < 4; i++) {
                    if (blue[i][j] == 1) cntOfBlock += 1;
                    else break;
                }

                if (cntOfBlock == 4) {
                    flag = false;
                    score += 1;
                    for (int i = 0; i < 4; i++) blue[i][j] = 0;
                    for (int k = j - 1; k >= 0; k--) {
                        for (int i = 0; i < 4; i++) {
                            blue[i][k + 1] = blue[i][k];
                        }
                    }
                    for (int i = 0; i < 4; i++) blue[i][0] = 0;
                    break;
                }
            }
            if(flag) break;
        }
    }


    private static void removeGreenRow() {
        while (true) {
            boolean flag = true;
            for (int i = 5; i > 1; i--) {
                int cntOfBlock = 0;
                for (int j = 0; j < 4; j++) {
                    if (green[i][j] == 1) cntOfBlock += 1;
                    else break;
                }

                if (cntOfBlock == 4) {
                    flag = false;
                    score += 1;
                    for (int j = 0; j < 4; j++) green[i][j] = 0;
                    for (int k = i - 1; k >= 0; k--) {
                        for (int j = 0; j < 4; j++) {
                            green[k + 1][j] = green[k][j];
                        }
                    }
                    for (int j = 0; j < 4; j++) {
                        green[0][j] = 0;
                    }
                    break;
                }
            }
            if(flag) break;
        }
    }

    private static void printBlue() {
        for (int[] bl : blue) {
            for (int b : bl) {
                System.out.print(b + " ");
            }
            System.out.println();
        }
    }

    private static void moveToBlue(int t, int x) {
        int col = 0;
        if (t == 1) {
            // 1x1
            for (int j = 0; j < 6; j++) {
                if(blue[x][j] != 0) break;
                col = j;
            }
            blue[x][col] = 1;
        } else if (t == 2) {
            // 1x2
            for (int j = 1; j < 6; j++) {
                if (blue[x][j - 1] != 0 || blue[x][j] != 0) break;
                col = j;
            }
            blue[x][col - 1] = 1;
            blue[x][col] = 1;
        } else {
            // 2x1
            for (int j = 0; j < 6; j++) {
                if(blue[x][j] != 0 || blue[x+1][j] != 0) break;
                col = j;
            }
            blue[x][col] = 1;
            blue[x + 1][col] = 1;
        }
    }

    private static void printGreen() {
        for (int[] gr : green) {
            for (int g : gr) {
                System.out.print(g + " ");
            }
            System.out.println();
        }
    }

    private static void moveToGreen(int t, int y) {
        int row = 0;
        if (t == 1) {
            // 1x1
            for (int i = 0; i < 6; i++) {
                if(green[i][y] != 0) break;

                row = i;
            }
            green[row][y] = 1;
        } else if (t == 2) {
            // 1x2
            for (int i = 0; i < 6; i++) {
                if (green[i][y] != 0 || green[i][y + 1] != 0) break;

                row = i;
            }
            green[row][y] = 1;
            green[row][y + 1] = 1;
        } else {
            // 2x1
            for (int i = 1; i < 6; i++) {
                if(green[i-1][y] != 0 || green[i][y] != 0) break;

                row = i;
            }
            green[row - 1][y] = 1;
            green[row][y] = 1;
        }
    }
}
728x90
๋ฐ˜์‘ํ˜•