๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

17406 - ๋ฐฐ์—ด ๋Œ๋ฆฌ๊ธฐ 4 [์„ฑ๊ณต(๋ฐ˜๋ก€ํžŒํŠธ)|01:06:16]

boj.kr/17406

 

ํ‘ผ ๊ณผ์ •

๋ฐฐ์—ด์˜ ์ด๋™ ์—ฐ์‚ฐ์ด K๊ฐœ ์ฃผ์–ด์ง€๋ฉด ๊ทธ K๊ฐœ๋ฅผ ๋ชจ๋‘ 1๋ฒˆ์”ฉ์€ ์‚ฌ์šฉํ•œ ํ›„ ๋ฐฐ์—ด์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋ฐฐ์—ด์˜ ํšŒ์ „ ์—ฐ์‚ฐ K๊ฐœ๋ฅผ ์–ด๋–ค ์ˆœ์„œ๋กœ ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์ตœ์ข… ๋ฐฐ์—ด์˜ ๋ชจ์Šต์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋˜๋ฏ€๋กœ ์ฒ˜์Œ ์ƒ๊ฐํ•ด๋‚ธ ์•„์ด๋””์–ด๋Š” '์ˆœ์—ด'์ด์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฃผ์–ด์ง„ ์ด๋™์—ฐ์‚ฐ๋“ค์„ 2์ฐจ์› ๋ฐฐ์—ด์— ๋‹ด์•„ ์ธ๋ฑ์Šค๋ฅผ ์ˆœ์—ด๋กœ ๋ฝ‘๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ K๊ฐœ๊ฐ€ ๋ฝ‘ํžˆ๊ฒŒ ๋œ๋‹ค๋ฉด, ํšŒ์ „ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค.

 

ํšŒ์ „ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ ์ด์ „์— ํ’€์—ˆ๋˜ boj.kr/17144 ๋ฌธ์ œ์—์„œ ์•„์ด๋””์–ด๋ฅผ ์–ป์–ด ํ•ด๋‹น ๊ตฌ์—ญ๋“ค์„ ๋‹ด์œผ๋ ค๊ณ  ํ–ˆ์œผ๋‚˜... ๊ตฌ์—ญ์„ ์–ด๋–ป๊ฒŒ ๋‹ด๋Š”์ง€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ทธ๋ƒฅ 4๋ฒˆ์˜ for๋ฌธ์„ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ 4๋ฒˆ์˜ for๋ฌธ์œผ๋กœ ์ง์ ‘ ํšŒ์ „ ์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ํšŒ์ „ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ฒซ ๊ฐ’๋งŒ tmp ๋ณ€์ˆ˜์— ๋‹ด์•„๋‘๊ณ  ํ•œ ๋ฐ”ํ€ด๋ฅผ ๋Œ๋ฆฐ ๋’ค์— ๋งˆ์ง€๋ง‰ ์œ„์น˜์—๋‹ค๊ฐ€ tmp ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทผ๋ฐ ์ƒ๊ฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ขŒํ‘œ๊ฐ€ ์ ์  ์•ˆ์ชฝ์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค๋Š” ์ ์ด๋‹ค. ์ฒ˜์Œ์— ์ฃผ์–ด์ง„ ์™ผ์ชฝ ์œ„ ์ขŒํ‘œ์™€ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์ขŒํ‘œ์˜ ๋ณ€ํ™”๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

๋ฌธ์ œ ์† ์˜ˆ์ œ ์‚ฌ์ง„
  • A[1][2] → A[2][3] → A[3][4]
  • A[5][6] → A[4][5] → A[3][4]

 

์ด๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋Š”๊ฑด ์™ผ์ชฝ ์œ„ ์ขŒํ‘œ๋Š” ํ•œ ๋ฒˆ์˜ ํšŒ์ „ ์—ฐ์‚ฐ ํ›„ x + 1, y + 1๋กœ ์ขŒํ‘œ๊ฐ€ ๋ณ€ํ™”ํ•˜๊ณ  ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์ขŒํ‘œ๋Š” ํ•œ ๋ฒˆ์˜ ํšŒ์ „ ์—ฐ์‚ฐ ํ›„ x - 1, y - 1๋กœ ์ขŒํ‘œ๊ฐ€ ๋ณ€ํ™”ํ•œ๋‹ค. ๊ทธ๋Ÿผ ๋‘˜์˜ ์ขŒํ‘œ๊ฐ€ ๊ฐ™์•„์ง€๊ฑฐ๋‚˜ ์™ผ์ชฝ ์œ„ ์ขŒํ‘œ๊ฐ€ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์ขŒํ‘œ๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ์— ์˜ค๋Š” ์ˆœ๊ฐ„์— ํšŒ์ „์„ ๋ฉˆ์ถ”๋ฉด ๋œ๋‹ค.

 

์ด๋Ÿฐ ์ƒ๊ฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค.

 

 

์ฝ”๋“œ

/**
 * 17406 - ๋ฐฐ์—ด ๋Œ๋ฆฌ๊ธฐ 4 [์„ฑ๊ณต(๋ฐ˜๋ก€ํžŒํŠธ)|01:06:16]
 * ๊ณจ๋“œ4, ๊ตฌํ˜„/์™„์ „ํƒ์ƒ‰, ์‹œ๋„3
 */

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

public class Main {
    // ์‹œ๊ฐ„์ œํ•œ 1์ดˆ, ๋ฉ”๋ชจ๋ฆฌ์ œํ•œ 512MB
    // ํฌ๊ธฐ N*M์ธ ๋ฐฐ์—ด A
    // ๋ฐฐ์—ด A์˜ ๊ฐ’ == ๊ฐ ํ–‰์— ์žˆ๋Š” ๋ชจ๋“  ์ˆ˜์˜ ํ•ฉ ์ค‘ ์ตœ์†Ÿ๊ฐ’
    // 1 2 3
    // 2 1 1
    // 4 5 6
    // ๋ฐฐ์—ด A์˜ ๊ฐ’ = 4
    // ํšŒ์ „ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ (r,c,s)
    // ๊ฐ€์žฅ ์™ผ์ชฝ ์œ— ์นธ (r-s, c-s)
    // ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์นธ (r+s, c+s)
    // ๋ฐฐ์—ด A์™€ ํšŒ์ „ ์—ฐ์‚ฐ์ด ์ฃผ์–ด์ง€๋ฉด ํšŒ์ „ ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ํ•œ ๋ฒˆ์”ฉ ์‚ฌ์šฉํ•ด์„œ ๋‚˜์˜ค๋Š” ๋ฐฐ์—ด A ๊ฐ’์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜์ž.
    // 3 <= N, M <= 50

    // ์™ผ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์ขŒํ‘œ ๋Œ€๊ฐ์„  ์•ˆ์œผ๋กœ ์ด๋™ -> ๋‘˜์˜ ์ขŒํ‘œ๊ฐ€ ๊ฐ™์•„์ง€๋ฉด ํšŒ์ „ stop!!

    static int[][] A;
    static int[][] rcs;
    static int[] idxlist;
    static int N, M, K;
    static int ret = Integer.MAX_VALUE;

    static void swap(int idx1, int idx2) {
        int tmp = idxlist[idx1];
        idxlist[idx1] = idxlist[idx2];
        idxlist[idx2] = tmp;
    }

    static void permutation(int r) {
        if (r == K) {
            int[][] m = new int[N][M];
            for (int i = 0; i < N; i++)
                m[i] = A[i].clone();

            // ํšŒ์ „ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ํ›„ ์ตœ์†Ÿ๊ฐ’ ๊ฐฑ์‹ 
            for (int i = 0; i < K; i++) {
                int y1 = rcs[idxlist[i]][0] - rcs[idxlist[i]][2];
                int x1 = rcs[idxlist[i]][1] - rcs[idxlist[i]][2];

                int y2 = rcs[idxlist[i]][0] + rcs[idxlist[i]][2];
                int x2 = rcs[idxlist[i]][1] + rcs[idxlist[i]][2];

                while (y1 != y2 || x1 != x2) {
                    int tmp = m[y1][x1];

                    for (int y = y1 + 1; y <= y2; y++)
                        m[y-1][x1] = m[y][x1];
                    for (int x = x1 + 1; x <= x2; x++)
                        m[y2][x-1] = m[y2][x];
                    for (int y = y2 - 1; y >= y1; y--)
                        m[y+1][x2] = m[y][x2];
                    for (int x = x2 - 1; x > x1; x--) {
                        m[y1][x+1] = m[y1][x];
                        if (x == x1+1) m[y1][x] = tmp;
                    }

                    y1++;
                    x1++;
                    y2--;
                    x2--;
                }
            }

            for (int y = 0; y < N; y++) {
                int sum = 0;
                for (int x = 0; x < M; x++) {
                    sum += m[y][x];
                }

                ret = Math.min(sum, ret);
            }
            return;
        }

        for (int i = r; i < K; i++) {
            swap(i, r);
            permutation(r + 1);
            swap(i, r);
        }
    }

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

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());

        A = new int[N][M];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                A[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        rcs = new int[K][3];
        idxlist = new int[K];
        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());

            rcs[i][0] = Integer.parseInt(st.nextToken())-1;
            rcs[i][1] = Integer.parseInt(st.nextToken())-1;
            rcs[i][2] = Integer.parseInt(st.nextToken());
            idxlist[i] = i;
        }

        permutation(0);
        System.out.println(ret);
    }
}

 

์ˆœ์—ด์—์„œ ๋ฝ‘ํžŒ ๊ฒฝ์šฐ์˜ ์ˆ˜๋งˆ๋‹ค ๋ฐฐ์—ด A๋ฅผ ์ดˆ๊ธฐ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์„ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•ด์„œ ์ด๋ฏธ ๋Œ๋ฆฐ ๋ฐฐ์—ดA์— ๋Œ€ํ•ด ๋˜ ํšŒ์ „ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋‹ต์ด ๋‚˜์™”๋Š”๋ฐ, ์งˆ๋ฌธ ๊ฒŒ์‹œํŒ์˜ ๋ฐ˜๋ก€๋ฅผ ๋ณด๊ณ  ์ด๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

 

ํฐ๋Œ๋‹˜ ํ•ด์„ค

๋ฐฐ์—ด A ํšŒ์ „

(3, 4, 2) → (4, 2, 1)

(4, 2, 1) → (3, 4, 2)

๋ฐฐ์—ด์„ ๋Œ๋ฆฌ๋Š” ์ˆœ์„œ๊ฐ€ ์žˆ๋‹ค. == ์ˆœ์—ด

๋ชจ๋“  ์ˆœ์„œ๋ฅผ ์ฒดํ‚นํ•ด์•ผ ํ•˜๋ฉด์„œ ๊ฐ’์„ ๋ฝ‘์•„๋‚ด๋Š” ๋‹จ์ˆœ ๊ตฌํ˜„ ๋ฌธ์ œ

 

๋ฌธ์ œ๋Š” ๋‘ ๊ฐ€์ง€ ํŒŒํŠธ๋กœ ๋‚˜๋‰จ

  • ๋Œ๋ ค์•ผ ํ•  ์˜์—ญ ๋ฝ‘์•„๋‚ด๊ธฐ

์›ํ˜•์œผ๋กœ ๋ณด์ง€๋ง๊ณ  1์ฐจ์›์ ์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด์•„๋ผ.

rbegin์ด ์ƒ๊ฐ๋‚˜์•ผํ•จ. (๊ต์•ˆ ํ™•์ธ)

  • ์˜์—ญ์„ ๋Œ๋ฆฌ๋Š” ์—ฐ์‚ฐ == rbegin

 

rbegin์€ C++์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์ด๋ฏ€๋กœ ์ž๋ฐ”์—์„œ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.