All :L

[SWEA/Java] 나무 높이 (14510) 본문

CODING/SWEA

[SWEA/Java] 나무 높이 (14510)

ofijwe 2024. 9. 12. 21:50
반응형

나무 높이 (14510)

1. 문제 분석

문제 개요

  • 나무의 높이를 조정하여 모든 나무를 최대 높이로 맞추기 위해 필요한 최소 일수를 계산하는 문제이다.

입력 형식

  • 첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
  • 다음 T개의 줄 각각에는 나무의 개수 N과 N개의 나무 높이가 주어진다.

출력 형식

  • 각 테스트 케이스에 대해, 모든 나무를 최대 높이로 맞추기 위해 필요한 최소 일수를 출력한다.

2. 알고리즘 종류

이 문제는 수학적 계산구간 탐색을 사용하여 해결하는 문제이다. 나무의 높이 차이에 따라 필요한 일수를 계산하고, 가장 많은 일수를 필요한 나무를 기준으로 최소 일수를 구한다.

3. 주요 부분 및 코드 작성 방법

1. 나무의 높이와 최대 높이 계산

  • 나무의 높이를 입력받고 최대 높이를 계산한다.

2. 각 나무를 최대 높이로 맞추기 위한 최소 일수 계산

  • 각 나무의 높이와 최대 높이의 차이를 계산하여, 필요한 일수를 구한다.

3. 결과 출력

  • 계산된 최대 일수를 출력하여 결과를 제공한다.

4. 코드 설명

(1) 메인 함수 (main)

  • 입력 처리

      Scanner sc = new Scanner(System.in); // Scanner 객체 생성
      int T = sc.nextInt(); // 테스트 케이스 수 입력
    • Scanner 객체를 생성하여 입력을 처리한다.
    • 테스트 케이스 수 T를 입력받는다.
  • 나무의 높이와 최대 높이 계산

      for (int tc = 1; tc <= T; tc++) { // 각 테스트 케이스 처리
          int N = sc.nextInt(); // 나무의 개수 입력
          int[] heights = new int[N]; // 나무의 높이를 저장할 배열 생성
          int maxHeight = 0; // 최대 높이 초기화
    
          for (int i = 0; i < N; i++) {
              heights[i] = sc.nextInt(); // 나무의 높이 입력
              if (heights[i] > maxHeight) {
                  maxHeight = heights[i]; // 최대 높이 갱신
              }
          }
    • 각 테스트 케이스마다 나무의 개수와 높이를 입력받아 최대 높이를 계산한다.
  • 모든 나무를 최대 높이로 맞추기 위한 최소 일수 계산

          int maxDays = 0; // 필요한 최대 일수 초기화
          for (int i = 0; i < N; i++) {
              int delta = maxHeight - heights[i]; // 현재 나무의 높이와 최대 높이의 차이 계산
              int days = 0; // 일수 초기화
    
              if (delta % 3 == 0) {
                  days = (delta / 3) * 2; // delta를 3으로 나눈 몫에 2를 곱하여 일수 계산
              } else if (delta % 3 == 1) {
                  days = (delta / 3) * 2 + 1; // delta를 3으로 나눈 몫에 2를 곱하고 나머지 1일 때 추가 1 더함
              } else {
                  days = (delta / 3) * 2 + 2; // delta를 3으로 나눈 몫에 2를 곱하고 나머지 2일 때 추가 2 더함
              }
    
              if (days > maxDays) {
                  maxDays = days; // 최대 일수 갱신
              }
          }
    • 나무를 최대 높이로 맞추기 위해 필요한 일수를 계산하고, 최대 일수를 업데이트한다.
  • 결과 출력

          System.out.println("#" + tc + " " + maxDays); // 결과 출력
      }
    
      sc.close(); // Scanner 객체 닫기
    • 각 테스트 케이스의 결과를 출력하고, Scanner 객체를 닫아 자원을 해제한다.

5. 전체 코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // Scanner 객체 생성
        int T = sc.nextInt(); // 테스트 케이스 수 입력

        for (int tc = 1; tc <= T; tc++) { // 각 테스트 케이스 처리
            int N = sc.nextInt(); // 나무의 개수 입력
            int[] heights = new int[N]; // 나무의 높이를 저장할 배열 생성
            int maxHeight = 0; // 최대 높이 초기화

            // 나무의 높이와 최대 높이 계산
            for (int i = 0; i < N; i++) {
                heights[i] = sc.nextInt(); // 나무의 높이 입력
                if (heights[i] > maxHeight) {
                    maxHeight = heights[i]; // 최대 높이 갱신
                }
            }

            // 모든 나무를 최대 높이로 맞추기 위한 최소 일수 계산
            int maxDays = 0; // 필요한 최대 일수 초기화
            for (int i = 0; i < N; i++) {
                int delta = maxHeight - heights[i]; // 현재 나무의 높이와 최대 높이의 차이 계산
                int days = 0; // 일수 초기화

                // delta를 3으로 나눈 몫과 나머지를 통해 필요한 일수를 계산
                if (delta % 3 == 0) {
                    days = (delta / 3) * 2; // delta를 3으로 나눈 몫에 2를 곱하여 일수 계산
                } else if (delta % 3 == 1) {
                    days = (delta / 3) * 2 + 1; // delta를 3으로 나눈 몫에 2를 곱하고 나머지 1일 때 추가 1 더함
                } else {
                    days = (delta / 3) * 2 + 2; // delta를 3으로 나눈 몫에 2를 곱하고 나머지 2일 때 추가 2 더함
                }

                // 최대 일수 업데이트
                if (days > maxDays) {
                    maxDays = days; // 최대 일수 갱신
                }
            }

            // 결과 출력
            System.out.println("#" + tc + " " + maxDays); // 결과 출력
        }

        sc.close(); // Scanner 객체 닫기
    }
}
반응형

'CODING > SWEA' 카테고리의 다른 글

[SWEA/Java] 디저트 카페 (2105)  (0) 2024.09.11
[SWEA/Java] 프로세서 연결하기 (1767)  (0) 2024.08.25
[SWEA/Java] 정사각형 방(1861)  (0) 2024.08.22
[SWEA/Java] 추억의 2048 게임(6190)  (0) 2024.08.22
Comments