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

[BOJ 17406] ๋ฐฐ์—ด ๋Œ๋ฆฌ๊ธฐ 4

by ๐Ÿณ Laboon 2025. 4. 3.

๋ฌธ์ œ ์ •๋ฆฌ

  • ๋ฐฐ์—ด์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
  • ๋ฐฐ์—ด์˜ ์ตœ์†Ÿ๊ฐ’์€ ๊ฐ ํ–‰์˜ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด๋‹ค.
  • ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€๋ฉด k๋ฒˆ์˜ ํšŒ์ „์„ ํ•œ๋‹ค.
  • ๊ฐ ํšŒ์ „์€ r, c, s ๊ฐ’์œผ๋กœ ํšŒ์ „ํ•œ๋‹ค.
  • (r-s, c-s) ๋ถ€ํ„ฐ (r+s, c+s) ๊นŒ์ง€ ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ๋‹ค.
  • ํšŒ์ „ ์—ฐ์‚ฐ์ด ๋‘ ๊ฐœ ์ด์ƒ์ด๋ฉด, ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ํšŸ์ˆ˜์— ๋”ฐ๋ผ ์ตœ์ข… ๋ฐฐ์—ด์ด ๋‹ฌ๋ผ์ง„๋‹ค.

์ œํ•œ ์‚ฌํ•ญ

  • 3 โ‰ค N, M โ‰ค 50
  • 1 โ‰ค K โ‰ค 6
  • 1 โ‰ค A[i][j] โ‰ค 100
  • 1 โ‰ค s
  • 1 โ‰ค r-s < r < r+s โ‰ค N
  • 1 โ‰ค c-s < c < c+s โ‰ค M

ํ•ต์‹ฌ ํฌ์ธํŠธ

  • ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ด ์กด์žฌํ•˜๋ฏ€๋กœ ๋ฐฑํŠธ๋ž˜ํ‚น
    • ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์—ฐ์‚ฐ ๊ณผ์ •์ด ์ ์œผ๋ฏ€๋กœ ์™„์ „ ํƒ์ƒ‰ ๊ฐ€๋Šฅ
    • ๋ฐฐ์—ด ํšŒ์ „์˜ ์ตœ์ข… ๊ฒฐ๊ณผ๋กœ ์ตœ์ข… ๋ฐฐ์—ด์„ ํš๋“ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์ง€์น˜๊ธฐ ํ•„์š” ์—†์Œ.
  • ๋ฐฐ์—ด ํšŒ์ „์— ๋Œ€ํ•œ ๊ตฌํ˜„๋ ฅ ํ•„์š”

ํ•ต์‹ฌ ๋กœ์ง

  • ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํšŒ์ „ ์ƒํƒœ ์ €์žฅํ•˜๋Š” ๋กœ์ง
  • ๋ฐฐ์—ด ์‹œ์ž‘ ์ง€์ ๋ถ€ํ„ฐ ์ข…๋ฃŒ ์ง€์ ๊นŒ์ง€์˜ ์‹œ๊ณ„ ๋ฐฉํ–ฅ ํšŒ์ „ ๋กœ์ง
  • ์ตœ์ข… ๋ฐฐ์—ด์—์„œ ์ตœ์†Ÿ ๊ฐ’์„ ์ฐพ๋Š” ๋กœ์ง

์ฝ”๋“œ

package com.study.baekjoon.bruteforce_with_backtracking.boj17406;

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

public class Main {

    static class Rotation {
        int r, c, s;
        public Rotation(int r, int c, int s) {
            this.r = r;
            this.c = c;
            this.s = s;
        }
    }
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static int n, m, k;
    static int[][] arr = new int[51][51];
    static int[][] tempArr = new int[51][51];
    static boolean[] visited = new boolean[6];
    static Rotation[] rotationOrder = new Rotation[6];
    static int minValue = Integer.MAX_VALUE;

    public static void main(String[] args) throws IOException {
        Rotation[] rotations = input();
        backtrack(rotations, 0);
        System.out.println(minValue);
    }

    private static Rotation[] input() throws IOException {
        st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        for (int i = 1; i <= n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 1; j <= m; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        Rotation[] rotations = new Rotation[k];
        for (int i = 0; i < k; i++) {
            st = new StringTokenizer(br.readLine());
            int r = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            int s = Integer.parseInt(st.nextToken());
            rotations[i] = new Rotation(r, c, s);
        }
        return rotations;
    }

    private static void backtrack(Rotation[] rotations, int depth) {
        if (depth == k) {
            for (int i = 1; i <= n; i++) tempArr[i] = Arrays.copyOf(arr[i], arr[i].length);
            for (int i = 0; i < k; i++) rotateArray(i);
            calculateArrayValue();
            return;
        }

        for (int i = 0; i < k; i++) {
            if (!visited[i]) {
                visited[i] = true;
                rotationOrder[depth] = rotations[i];
                backtrack(rotations, depth + 1);
                visited[i] = false;
            }
        }
    }

    private static void rotateArray(int idx) {
        int r = rotationOrder[idx].r;
        int c = rotationOrder[idx].c;
        int s = rotationOrder[idx].s;

        for (int layer = 1; layer <= s; layer++) {
            int sr = r - layer, sc = c - layer;
            int er = r + layer, ec = c + layer;

            int temp = tempArr[sr][sc];
            for (int i = sr; i < er; i++) tempArr[i][sc] = tempArr[i+1][sc];
            for (int j = sc; j < ec; j++) tempArr[er][j] = tempArr[er][j+1];
            for (int i = er; i > sr; i--) tempArr[i][ec] = tempArr[i-1][ec];
            for (int j = ec; j > sc; j--) tempArr[sr][j] = tempArr[sr][j-1];
            tempArr[sr][sc+1] = temp;
        }
    }

    private static void calculateArrayValue() {
        int minSum = Integer.MAX_VALUE;

        for (int i = 1; i <= n; i++) {
            int rowSum = 0;
            for (int j = 1; j <= m; j++) {
                rowSum += tempArr[i][j];
            }
            minSum = Math.min(minSum, rowSum);
        }

        minValue = Math.min(minValue, minSum);
    }

}

 

ํ•ต์‹ฌ ๋กœ์ง ์ถ”๊ฐ€ ์„ค๋ช…

๊ทธ๋ฆผ1. ๋ฐฑํŠธ๋ž˜ํ‚น ๊ณผ์ •๊ณผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

 

๊ฐ€์ •: Rotattion๊ฐ€ 3๊ฐœ๊ฐ€ ์žˆ์Œ

1. r0, r1, r2 ์ˆœ์„œ๋กœ ํšŒ์ „ ์—ฐ์‚ฐ ์ •๋ณด๋ฅผ ์ €์žฅ

2. ๋ฐฑํŠธ๋ž˜ํ‚น ๊ณผ์ •์—์„œ r0, r2, r1 ์ˆœ์„œ์˜ ํšŒ์ „ ์—ฐ์‚ฐ ์ •๋ณด๋„ ์ €์žฅํ•˜๊ฒŒ ๋จ

 

๊ทธ๋ฆผ2. ๋ฐฐ์—ด ํšŒ์ „ ์—ฐ์‚ฐ

 

1. ์ค‘์‹ฌ์ ์œผ๋กœ ๋ถ€ํ„ฐ s์˜ ๊ฐœ์ˆ˜๋งŒํผ ํšŒ์ „

2. (r - 1, c - 1) to (r + 1, c + 1)๊นŒ์ง€ ๊ฐ ๊ฐ ํšŒ์ „ํ•˜๋Š” ๊ตฌํ˜„

 

3. ์ตœ์ข… ์—ฐ์‚ฐ

 

๋ฌธ์ œ ์ถœ์ฒ˜: https://www.acmicpc.net/problem/17406

'์•Œ๊ณ ๋ฆฌ์ฆ˜ > ๋ฐฑ์ค€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ 9252] LCS2  (0) 2025.04.08
[BOJ 1826] ์—ฐ๋ฃŒ ์ฑ„์šฐ๊ธฐ  (0) 2025.03.31
[BOJ 20207] ๋‹ฌ๋ ฅ  (0) 2025.03.31
๋ฐฑ์ค€ - [BOJ 22856] ํŠธ๋ฆฌ ์ˆœํšŒ  (0) 2024.07.08
๋ฐฑ์ค€ - [BOJ 1865] ์›œํ™€  (0) 2024.07.06