반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-19 00:03
관리 메뉴

ImJay

[BOJ/Java] 2477. 참외밭 본문

알고리즘/수학

[BOJ/Java] 2477. 참외밭

ImJay 2024. 1. 20. 18:45
반응형

[BOJ/Java] 2477. 참외밭

 

2477번: 참외밭

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지

www.acmicpc.net


해설

풀이

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));
        
        // 입력으로 주어지는 1m2의 넓이에 자라는 참외의 개수
        int k = Integer.parseInt(br.readLine());

        // 각 꼭짓점에서의 방향과 길이를 저장하는 배열
        int[] d = new int[6];
        int[] len = new int[6];

        // 최대 길이와 최대 길이의 인덱스를 저장할 변수
        int max = 0;
        int maxIndex = 0;

        // 입력 받기 및 최대 길이 및 최대 길이의 인덱스 찾기
        for (int i = 0; i < 6; i++) {
            String input = br.readLine();
            StringTokenizer st = new StringTokenizer(input);
            d[i] = Integer.parseInt(st.nextToken());
            len[i] = Integer.parseInt(st.nextToken());

            max = Math.max(max, len[i]);
            if (max == len[i]) maxIndex = i;
        }

        // 최대 길이의 인덱스를 기준으로 좌우의 인덱스 계산
        int leftIndex, rightIndex = 0;
        if (maxIndex == 0) {
            leftIndex = 5;
            rightIndex = 1;
        } else if (maxIndex == 5) {
            leftIndex = 4;
            rightIndex = 0;
        } else {
            leftIndex = maxIndex - 1;
            rightIndex = maxIndex + 1;
        }

        // 참외밭 면적 계산
        int area = 0;
        if (len[leftIndex] > len[rightIndex]) {
            area = len[leftIndex] * len[maxIndex];

            // 좌우 인덱스 갱신
            rightIndex++;
            if (rightIndex > 5) rightIndex = 0;
            int x = len[rightIndex];

            rightIndex++;
            if (rightIndex > 5) rightIndex = 0;
            int y = len[rightIndex];

            // 겹치는 부분의 면적 차감
            area -= x * y;
        } else {
            area = len[rightIndex] * len[maxIndex];

            // 좌우 인덱스 갱신
            leftIndex--;
            if (leftIndex < 0) leftIndex = 5;
            int x = len[leftIndex];

            leftIndex--;
            if (leftIndex < 0) leftIndex = 5;
            int y = len[leftIndex];

            // 겹치는 부분의 면적 차감
            area -= x * y;
        }

        // 총 참외 개수 계산 및 출력
        int res = area * k;
        StringBuilder sb = new StringBuilder();
        sb.append(res);
        sb.append("\n");

        System.out.print(sb);
    }
}
반응형

'알고리즘 > 수학' 카테고리의 다른 글

[BOJ/Java] 2991. 사나운 개  (0) 2024.01.20
Comments