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

[Java] BOJ 18111 ๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ

by ๐ŸŠ๊ทค๐ŸŠ 2024. 8. 14.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/18111

  • ํŒ€ ๋ ˆ๋“œ์‹œํ”„ํŠธ๋Š” ๋Œ€ํšŒ ์ค€๋น„๋ฅผ ํ•˜๋‹ค๊ฐ€ ์ง€๋ฃจํ•ด์ ธ์„œ ์ƒŒ๋“œ๋ฐ•์Šค ๊ฒŒ์ž„์ธ ‘๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ’๋ฅผ ์ผฐ๋‹ค.
  • ๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ๋Š” 1 × 1 × 1(์„ธ๋กœ, ๊ฐ€๋กœ, ๋†’์ด) ํฌ๊ธฐ์˜ ๋ธ”๋ก๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ 3์ฐจ์› ์„ธ๊ณ„์—์„œ ์ž์œ ๋กญ๊ฒŒ ๋•…์„ ํŒŒ๊ฑฐ๋‚˜ ์ง‘์„ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ๊ฒŒ์ž„์ด๋‹ค.
  • lvalue๋Š” ์„ธ๋กœ N, ๊ฐ€๋กœ M ํฌ๊ธฐ์˜ ์ง‘ํ„ฐ๋ฅผ ๊ณจ๋ž๋‹ค. ์ง‘ํ„ฐ ๋งจ ์™ผ์ชฝ ์œ„์˜ ์ขŒํ‘œ๋Š” (0, 0)์ด๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉ์ ์€ ์ด ์ง‘ํ„ฐ ๋‚ด์˜ ๋•…์˜ ๋†’์ด๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    1. ์ขŒํ‘œ (i, j)์˜ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ธ”๋ก์„ ์ œ๊ฑฐํ•˜์—ฌ ์ธ๋ฒคํ† ๋ฆฌ์— ๋„ฃ๋Š”๋‹ค.
    2. ์ธ๋ฒคํ† ๋ฆฌ์—์„œ ๋ธ”๋ก ํ•˜๋‚˜๋ฅผ ๊บผ๋‚ด์–ด ์ขŒํ‘œ (i, j)์˜ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ธ”๋ก ์œ„์— ๋†“๋Š”๋‹ค.
  • 1๋ฒˆ ์ž‘์—…์€ 2์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋ฉฐ, 2๋ฒˆ ์ž‘์—…์€ 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค. ๋ฐค์—๋Š” ๋ฌด์„œ์šด ๋ชฌ์Šคํ„ฐ๋“ค์ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๋•… ๊ณ ๋ฅด๊ธฐ ์ž‘์—…์„ ๋งˆ์ณ์•ผ ํ•œ๋‹ค.
  • ‘๋•… ๊ณ ๋ฅด๊ธฐ’ ์ž‘์—…์— ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„๊ณผ ๊ทธ ๊ฒฝ์šฐ ๋•…์˜ ๋†’์ด๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค.
  • ๋‹จ, ์ง‘ํ„ฐ ์•„๋ž˜์— ๋™๊ตด ๋“ฑ ๋นˆ ๊ณต๊ฐ„์€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ง‘ํ„ฐ ๋ฐ”๊นฅ์—์„œ ๋ธ”๋ก์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค.
  • ๋˜ํ•œ, ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ ์ธ๋ฒคํ† ๋ฆฌ์—๋Š” B๊ฐœ์˜ ๋ธ”๋ก์ด ๋“ค์–ด ์žˆ๋‹ค. ๋•…์˜ ๋†’์ด๋Š” 256๋ธ”๋ก์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค.
  • ๋ชฉ์žฌ๋ฅผ ์ถฉ๋ถ„ํžˆ ๋ชจ์€ lvalue๋Š” ์ง‘์„ ์ง“๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ๊ณ ๋ฅด์ง€ ์•Š์€ ๋•…์—๋Š” ์ง‘์„ ์ง€์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋•…์˜ ๋†’์ด๋ฅผ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ‘๋•… ๊ณ ๋ฅด๊ธฐ’ ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ฒซ์งธ ์ค„์— N, M, B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ M, N ≤ 500, 0 ≤ B ≤ 6.4 × 107)
  • ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฐ๊ฐ M๊ฐœ์˜ ์ •์ˆ˜๋กœ ๋•…์˜ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • (i + 2)๋ฒˆ์งธ ์ค„์˜ (j + 1)๋ฒˆ์งธ ์ˆ˜๋Š” ์ขŒํ‘œ (i, j)์—์„œ์˜ ๋•…์˜ ๋†’์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋•…์˜ ๋†’์ด๋Š” 256๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.
  • ์ฒซ์งธ ์ค„์— ๋•…์„ ๊ณ ๋ฅด๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ๋•…์˜ ๋†’์ด๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค. ๋‹ต์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋‹ค๋ฉด ๊ทธ์ค‘์—์„œ ๋•…์˜ ๋†’์ด๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฒƒ์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

์•„์ด๋””์–ด

  • ๋•…์˜ ๋†’์ด๊ฐ€ 0๋ถ€ํ„ฐ 256๊นŒ์ง€๋ผ๊ณ  ํ•˜์˜€์œผ๋ฏ€๋กœ 0๋ถ€ํ„ฐ 256๊นŒ์ง€ for๋ฌธ์„ ๋ˆ๋‹ค.
  • for๋ฌธ์„ ๋Œ๋ฉด์„œ ์‹œ๊ฐ„์ดˆ์™€ ๋‚จ์€ ๋ธ”๋Ÿญ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋ณ€์ˆ˜๋ฅผ ํ•ญ์ƒ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋ฉฐ, ํ•ด๋‹น ๋•…์˜ ๋†’์ด๊ฐ€ ๊ธฐ์ค€ ๋†’์ด๋ณด๋‹ค ๋†’์œผ๋ฉด ํ•ด๋‹น ๋†’์ด๋งŒํผ ๋ธ”๋Ÿญ ์ˆ˜๋ฅผ ๋”ํ•ด์ฃผ๊ณ  ๊ทธ ๋†’์ด๋งŒํผ 2๋ฅผ ๊ณฑํ•ด์„œ ์‹œ๊ฐ„์ดˆ์— ๋”ํ•ด์ค€๋‹ค.
  • ๋งŒ์•ฝ ํ•ด๋‹น ๋•…์˜ ๋†’์ด๊ฐ€ ๊ธฐ์ค€ ๋†’์ด๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด ํ•ด๋‹น ๋†’์ด๋งŒํผ ๋ธ”๋Ÿญ ์ˆ˜๋ฅผ ๋นผ์ฃผ๊ณ  ๋†’์ด๋งŒํผ ์‹œ๊ฐ„์ดˆ๋ฅผ ๋”ํ•ด์ค€๋‹ค.
  • ๋•…์„ ๋‹ค ๋Œ๊ณ  ๋‚œ ํ›„, ๋‚จ์€ ๋ธ”๋Ÿญ์˜ ์ˆ˜๊ฐ€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ  ๊ณ„์‚ฐ๋œ ์ดˆ๊ฐ€ ํ˜„์žฌ ๊ฒฐ๊ณผ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด ๊ฒฐ๊ณผ์ดˆ์™€ ๋•… ๋†’์ด๋ฅผ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.  

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • ์ฒ˜์Œ์— DFS๋กœ ํ’€๋ ค๋‹ค๊ฐ€... ์‹คํŒจํ•ด์„œ 3์ค‘ for๋ฌธ์œผ๋กœ ํ’€๊ฒŒ ๋˜์—ˆ๋‹ค... ์ผ๋‹จ ์™„ํƒ์œผ๋กœ ํ’€์–ด๋†“๊ณ  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด๋“  ํ•ด์•ผ๊ฒ ๋‹ค...!

์šฐ์„ ์€ ๊ตฌํ˜„๋ถ€ํ„ฐ...!

์ฝ”๋“œ

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

public class BOJ18111 {

    static int N;
    static int M;
    static int B;
    static int ground[][];
    static int result;
    static int result2;

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

        StringTokenizer st = new StringTokenizer(br.readLine());

        // ์—ด
        N = Integer.parseInt(st.nextToken());
        // ํ–‰
        M = Integer.parseInt(st.nextToken());
        // ๋•…์˜ ๊ฐœ์ˆ˜
        B = Integer.parseInt(st.nextToken());

        // ๋•…์˜ ๋†’์ด๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด
        ground = new int[N][M];
        // ์ดˆ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
        result = Integer.MAX_VALUE;
        // ๋•…์˜ ๋†’์ด๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
        result2 = 0;

        // ๋ฐฐ์—ด์— ๊ฐ’ ์ €์žฅ
        for(int i = 0; i < N; i++){
            StringTokenizer st2 = new StringTokenizer(br.readLine());
            for(int j = 0; j < M; j++){
                int n = Integer.parseInt(st2.nextToken());

                ground[i][j] = n;
            }
        }

        for(int h = 0; h <= 256; h++){
            // ์‹œ๊ฐ„์ดˆ๋ฅผ ๊ณ„์‚ฐํ•  ๋ณ€์ˆ˜
            int s = 0;
            // ๋‚จ์€ ๋ธ”๋Ÿญ ์ˆ˜
            int b = B;

            for(int i = 0; i < N; i++){
                for(int j = 0; j < M; j++){
                    if(ground[i][j] > h){
                        int height = ground[i][j] - h;

                        // ๊ธฐ์ค€ ๋•…๋ณด๋‹ค ํ˜„์žฌ ๋•… ๋†’์ด๊ฐ€ ๋†’์œผ๋ฏ€๋กœ ๋‚จ์€ ๋•… ์ˆ˜์— ๋”ํ•ด์คŒ
                        b = b + height;

                        // ๋ธ”๋Ÿญ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ธ๋ฒคํ† ๋ฆฌ์— ๋„ฃ์—ˆ์œผ๋ฏ€๋กœ ๋„ฃ์€ ๋ธ”๋ก ์ˆ˜ * 2์ดˆ
                        s = s + 2*height;
                    }
                    else if(ground[i][j] < h){
                        int height = h - ground[i][j];

                        // ๊ธฐ์ค€ ๋•…๋ณด๋‹ค ํ˜„์žฌ ๋•… ๋†’์ด๊ฐ€ ๋‚ฎ์œผ๋ฏ€๋กœ ๋‚จ์€ ๋•… ์ˆ˜์— ๋นผ์คŒ
                        b = b - height;

                        // ๋ธ”๋Ÿญ์„ ์ขŒํ‘œ์— ๋„ฃ์–ด์„œ ๋„ฃ์€ ๋ธ”๋ก ์ˆ˜ * 1์ดˆ
                        s = s + height;
                    }
                }
            }

            // ๋ธ”๋Ÿญ์ˆ˜๊ฐ€ 0๊ฐœ๋ณด๋‹ค ํฌ๊ณ  ๊ณ„์‚ฐ๋œ ์ดˆ๊ฐ€ ๊ฒฐ๊ณผ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด
            // ๊ฒฐ๊ณผ์ดˆ์™€ ๋•… ๋†’์ด๋ฅผ ๊ฐฑ์‹ 
            if(b >= 0 && s <= result){
                result = s;
                result2 = h;
            }
        }

        System.out.println(result + " " + result2);
    }
}