La foret rouge
Published on

백준 2477: 참외밭

Authors
  • avatar
    Name
    신주용

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

문제 이해

  • 참외밭의 넓이를 구하고, 단위 면적당 참외 수를 곱해서 총 참외 개수를 구함.
    • 단위 면적은 1m21m^2여서 계산하기 편하게 주어짐.
  • 밭의 모양이 ㄱ자를 회전한 모양인 것이 문제.
  • 한 꼭짓점에서 출발하여, 반시계 방향으로 변의 길이가 입력으로 주어짐.

접근 방법

  • 큰 사각형에서 작은 사각형 넓이를 빼면 됨.
  • 큰 사각형, 작은 사각형의 넓이를 구하려면 변의 길이를 알아야 함.
boj2477
  • 큰 사각형 변의 길이?
    • 긴 변은 6개 중 1번씩만 나옴.
  • 밭의 형태는 꼭 처음 출발한 꼭짓점으로 돌아오는 육각형.
    • 짧은 변은 두 번씩 나오고, 긴 변의 반대에 위치
    • 문제 예시처럼 왼쪽 위 꼭짓점에서 출발한다면 남, 동, 남, 동, 북, 서.
    • 60, 20 사이 구석진 꼭짓점에서 출발한다면 남, 동, 북, 서, 남, 동.
    • 이 모양이 아니라 다른 모양이더라도 문제에서 주어진 모양이 육각형 형태이므로 동일하게 적용됨.
  • 그러면 여기서 각 변의 개수는 남 2, 동 2, 북 1, 서 1 이다.
  • 한 번씩만 나오는 북(50m), 서(160m)가 긴 변(큰 사각형)이고, 이 값과 3 인덱스 떨어진 변이 짧은 변.

코드

import java.util.Scanner;

public class Boj2477 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 입력
        int K = sc.nextInt();
        int[] d = new int[7];
        int[] l = new int[7];

        // 변의 방향을 동1 서2 남3 북4로 줬으므로 0번 안 쓰고 인덱스 맞춰 쓰기
        int[] dCount = {0, 0, 0, 0, 0};

        // 입력과 동시에 변 개수 세기
        for (int i = 1; i <= 6; i++) {
            d[i] = sc.nextInt();
            l[i] = sc.nextInt();
            dCount[d[i]] += 1;
        }
        sc.close();

        int bigArea = 1;
        int smallArea = 1;
        for (int i = 1; i <= 6; i++) {
            if (dCount[d[i]] != 1) continue;

            // 1번만 나온 변으로 큰 사각형 넓이 계산
            bigArea *= l[i];

            // 그 변과 3 인덱스 떨어진 변으로 짧은 사각형 넓이 계산
            smallArea *= l[i + 3 > 6 ? i - 3 : i + 3];
        }

        System.out.println((bigArea - smallArea) * K);
    }
}

결과

17620KB / 216ms