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

 

18111번: 마인크래프트

팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게

www.acmicpc.net

접근 방법

처음 문제를 접했을 때 높이의 분포가 가장 많은 걸 기준으로 파고,놓기를 하려했다가 최소 시간이 아닐 수 있어 포기.

생각해보니 높이가 0~256까지 있으니 기준을 잡고 그 높이로 전체 탐색을 돌리면 되겠다 싶어서 구현.

 

문제 풀이

  • 기준을 0~256까지 잡고 탐색
  • 높이가 기준보다 높으면 땅을 파고, 낮으면 땅을 놓아서 dig, put 변수에 더하기
  • 전체를 평평하게 했으면 인벤에 있는 흙+판 흙이 놓은 흙보다 크거나 같으면 시간과 높이 갱신
    • 이 때, 순서 대로 땅을 파고 놓는게 아니니 다끝나고 계산을 해도 됨.
  • 최소 시간의 최대 높이를 비교, 반복문 탈출 후 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Baekjoon.Practice
{
    class _18111
    {
        static void Main_18111(string[] args)
        {
            int[] n = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            int have = n[2]; //가진 흙

            int[][] arr = new int[n[0]][];
            for(int i = 0; i< n[0]; i++)
                arr[i] = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);

            int time = -1;
            int high = -1;
            for(int earth = 0; earth<257; earth++)
            {
                int dig = 0; //파기
                int put = 0; //놓기

                for(int i = 0; i < n[0]; i++)
                {
                    for(int j = 0; j < n[1]; j++)
                    {
                        if (arr[i][j] > earth)
                            dig += (arr[i][j] - earth);
                        else if (arr[i][j] < earth)
                            put += (earth - arr[i][j]);
                    }
                }

                if(have + dig >= put)
                {
                    if (time == -1)
                        time = dig * 2 + put;

                    if(time >= dig * 2 + put)
                    {
                        time = dig * 2 + put;
                        high = Math.Max(high, earth);
                    }
                }
            }

            Console.WriteLine($"{time} {high}");
        }
    }
}

'문제 풀이 > C#' 카테고리의 다른 글

[1644] - 소수의 연속합  (0) 2022.11.04
[15922] - 아우으 우아으이야!!  (0) 2022.11.04
[9251] - LCS  (0) 2022.11.02
[1918] - 후위 표기식  (0) 2022.11.01
[7562] - 나이트의 이동  (0) 2022.10.31

+ Recent posts