[BOJ][C#] 18111 마인크래프트

LimJaeJun·2023년 12월 7일
0

PS/BOJ

목록 보기
57/108

📕 문제

📌 링크

📗 접근 방식

  • board를 입력받으면서 최대값과 최소값을 저장한다.
  • 높이를 최소값과 최대값 사이로 반복문을 돌려가면서 걸리는 시간을 체크한다.
  • board[i,j]현재 높이와의 차이
    • 양수라면
      • 인벤토리에 차이만큼 더해주고 차이의 두배만큼 시간을 더해준다.
    • 음수라면
      • 인벤토리에 차이만큼 빼주고 차이만큼 시간을 더해준다.
      • 음수이기 때문에 표현과 반대로 코드를 작성해야한다.
  • 인벤토리가 음수라면 할 수 없는 행동이기 때문에 저장하지 않는다.
  • 시간이 적게 걸렸다면 시간과 높이를 최신화시켜준다.
  • 시간이 같게 걸렸다면 높은 높이를 저장한다.

📘 코드

namespace BOJ_18111
{
    class Program
    {
        static void Main()
        {
            using StreamReader sr = new StreamReader(new BufferedStream(Console.OpenStandardInput()));
            using StreamWriter sw = new StreamWriter(new BufferedStream(Console.OpenStandardOutput()));

            int[] inputs = Array.ConvertAll(sr.ReadLine().Split(), int.Parse);
            int n = inputs[0];
            int m = inputs[1];
            int b = inputs[2];

            int[,] board = new int[n, m];
            int minHeight = int.MaxValue;
            int maxHeight = int.MinValue;
            
            for (int i = 0; i < n; i++)
            {
                inputs = Array.ConvertAll(sr.ReadLine().Split(), int.Parse);
                for (int j = 0; j < m; j++)
                {
                    board[i, j] = inputs[j];

                    minHeight = Math.Min(board[i, j], minHeight);
                    maxHeight = Math.Max(board[i, j], maxHeight);
                }
            }
            
            int answerTime = int.MaxValue;
            int answerHeight = 0;
            for (int height = minHeight; height <= maxHeight; height++)
            {
                int inventory = b;
                int time = 0;
                
                for (int i = 0; i < n; i++)
                {
                    for (int j = 0; j < m; j++)
                    {
                        if (board[i, j] == height) continue;

                        int gap = board[i, j] - height;

                        if (gap > 0)
                        {
                            inventory += gap;
                            time += gap * 2;
                        }
                        else
                        {
                            inventory += gap;
                            time -= gap;
                        }
                    }
                }

                if (inventory < 0) continue;
                
                if (time < answerTime)
                {
                    answerTime = time;
                    answerHeight = height;
                }
                else if (time == answerTime)
                {
                    answerHeight = Math.Max(answerHeight, height);
                }
            }
            
            sw.Write($"{answerTime} {answerHeight}");
        }
    }
}

📙 오답노트

board[i,j]현재 높이를 비교할 때 tempBoard를 선언하여 비교하였으며 새로운 높이로 비교를 시작하기 전에 tempBoard를 초기화시켜주고 비교하였다.
당연하게도 이 로직은 굉장히 비효율적이며 시간초과가 났다.

📒 알고리즘 분류

  • 구현
  • 브루트포스 알고리즘
profile
Dreams Come True

0개의 댓글

관련 채용 정보