백준 문제 풀이 (2477번) java

tae_in·2022년 9월 5일
0

알고리즘

목록 보기
9/12

문제

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

풀이

문제에서 육각형의 방향과 길이를 입력받는다. 이 문제를 입력받은 방향을 이용하지 않고 문제를 풀었다. 이용하지 않고 풀 수 있는 이유는 다음과 같다.

6각형이 위의 그림처럼 생겼다고 가정하자. 그림에서 길이가 가장 긴 변은 160이다. 이 변의 양옆으로 50과 20의 길이를 가진 변이 있다. 문제에서 시계 반대 방향으로 값을 입력받는다고 하였으므로 가장 긴 변의 바로 전과 바로 다음으로 입력받는 값은 160이 가로라고 가정해 보면 세로일 것이고 160의 변의 길이를 가지는 값의 앞 변과 뒤 변 중 하나는 세로에서 가장 긴 변일 것이다. 그림에서 세로 변 중 30은 실제 면적을 구하는 데 사용되지 않는다. 이렇게 가장 큰 변을 구하고 그 앞뒤의 변만 확인한다면 30과 같은 실제 면적을 구하는 데 사용되지 않는 변을 고려하지 않아도 된다.

<입력 값을 받은 후에>
1. 가장 큰 변의 길이를 구하고 그 입력 값의 인덱스를 저장해둔다.(maximumNum, 변의 길이는 maximum)
2. 가장 큰 변의 앞 뒤 인덱스 값에 담긴 값을 비교하여 큰 값과 작은 값을 각각 변수에 담는다. (max, min)
3. 값을 담을 때 maximumNum+1번째 인덱스가 큰지 maximumNum-1번째 인덱스가 큰지 확인하여 큰 값이 나온 인덱스를 maxNum 변수에 저장한다.
4. maxNum 기준으로 앞 뒤 값을 비교하여 작은 값을 minimum 변수에 저장한다.(이 때 큰 값은 maximum이다.)
정리:
가장 큰 변의 길이: maximum(가로라고 가정)
가장 큰 변의 길이: max(세로) - maximumNum으로 찾은 값
가장 작은 변의 길이: min(세로) - maximumNum으로 찾은 값
가장 작은 변의 길이: minimum(가로) - maxNum으로 찾은 값

코드

package Category;

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

public class q_2477 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringTokenizer st;
        int[] arr = new int[6];
        int maximum = 0;
        int maximumNum = 0;
        for (int i = 0; i < 6; i++) {
            st = new StringTokenizer(br.readLine(), " ");

            int direct = Integer.parseInt(st.nextToken());
            arr[i] = Integer.parseInt(st.nextToken());;

            if (maximum < arr[i]) {

                maximum = arr[i];
                maximumNum = i;
            }
        }
        int maxNum, max, min;
        if (arr[(maximumNum - 1 + 6) % 6] < arr[(maximumNum + 1) % 6]) {
            maxNum = maximumNum + 1;
            max = arr[(maximumNum + 1) % 6];
            min = arr[(maximumNum - 1 + 6) % 6];
        } else {
            maxNum = maximumNum - 1;
            max = arr[(maximumNum - 1 + 6) % 6];
            min = arr[(maximumNum + 1) % 6];
        }
        int minimum = Math.min(arr[(maxNum - 1 + 6) % 6], arr[(maxNum + 1) % 6]);
        System.out.println((max * maximum - (max - min) * (maximum - minimum)) * T);
    }
}

0개의 댓글