IT 개발 관련/[Algorithm]

[백준] 2477번 : 참외밭 - Java

Baileyton 2024. 6. 19. 22:03
728x90

문제

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

참외밭의 변 길이와 방향이 주어졌을 때, 참외밭의 면적을 구하고 참외의 개수를 출력하는 문제

접근 방법

  • 주어진 참외밭의 변 길이와 방향을 통해 큰 사각형의 최대 너비와 높이를 구합니다.
  • 큰 사각형에서 제외할 작은 사각형의 너비와 높이를 구합니다.
  • 큰 사각형의 면적에서 작은 사각형의 면적을 빼서 참외밭의 실제 면적을 구합니다.
  • 이 면적에 참외의 개수 K를 곱하여 총 참외의 수를 도출합니다.

구현

  • 입력받기: 참외의 개수 K와 참외밭의 변 길이와 방향을 입력받습니다.
  • 큰 사각형의 변 길이 구하기: 방향이 1 또는 2인 경우(동쪽, 서쪽) 가장 긴 변을 maxWidth로 설정하고, 방향이 3 또는 4인 경우(남쪽, 북쪽) 가장 긴 변을 maxHeight로 설정합니다.
  • 작은 사각형의 변 길이 구하기: 큰 사각형의 변을 기준으로 작은 사각형의 변의 길이를 구합니다. 작은 사각형의 너비(minWidth)와 높이(minHeight)를 구하기 위해 이전 변과 다음 변의 차이를 계산합니다.
  • 참외밭의 면적 계산: 큰 사각형의 면적에서 작은 사각형의 면적을 빼서 참외밭의 실제 면적을 구한 후, 이를 참외의 개수 K와 곱하여 결과를 출력합니다.

코드

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

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

        int K = Integer.parseInt(br.readLine());

        int[] directions = new int[6];
        int[] lengths = new int[6];

        StringTokenizer st;
        for (int i = 0; i < 6; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            directions[i] = Integer.parseInt(st.nextToken());
            lengths[i] = Integer.parseInt(st.nextToken());
        }

        int maxWidth = 0;
        int maxHeight = 0;
        int minWidth = 0;
        int minHeight = 0;

        for (int i = 0; i < 6; i++) {
            if(directions[i] == 1 || directions[i] == 2) {
                if (maxWidth < lengths[i]) {
                    maxWidth = lengths[i];
                }
            } else if (directions[i] == 3 || directions[i] == 4) {
                if (maxHeight < lengths[i]) {
                    maxHeight = lengths[i];
                }
            }
        }

        for (int i = 0; i < 6; i++) {
            if ((directions[i] == 1 || directions[i] == 2) && lengths[i] == maxWidth) {
                minHeight = Math.abs(lengths[(i + 5) % 6] - lengths[(i + 1) % 6]);
            } else if ((directions[i] == 3 || directions[i] == 4) && lengths[i] == maxHeight) {
                minWidth = Math.abs(lengths[(i + 5) % 6] - lengths[(i + 1) % 6]);
            }
        }

        int result = ((maxWidth * maxHeight) - (minWidth * minHeight)) * K;

        System.out.println(result);
    }
}

 

메모리:14128kb 시간:96ms

728x90