LA FORET ROUGE

백준 2477: 참외밭

⏱ 1m | Categories: ALGORITHM | Tags: BAEKJOON , JAVA

참외밭의 넓이를 구하고, 단위 면적당 참외 수를 곱해서 총 참외 개수를 구함.

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

문제 이해

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

접근 방법

  • 큰 사각형에서 작은 사각형 넓이를 빼면 됨.
  • 큰 사각형, 작은 사각형의 넓이를 구하려면 변의 길이를 알아야 함.

boj2477

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

코드

 1import java.util.Scanner;
 2
 3public class Boj2477 {
 4    public static void main(String[] args) {
 5        Scanner sc = new Scanner(System.in);
 6
 7        // 입력
 8        int K = sc.nextInt();
 9        int[] d = new int[7];
10        int[] l = new int[7];
11
12        // 변의 방향을 동1 서2 남3 북4로 줬으므로 0번 안 쓰고 인덱스 맞춰 쓰기
13        int[] dCount = {0, 0, 0, 0, 0};
14
15        // 입력과 동시에 변 개수 세기
16        for (int i = 1; i <= 6; i++) {
17            d[i] = sc.nextInt();
18            l[i] = sc.nextInt();
19            dCount[d[i]] += 1;
20        }
21        sc.close();
22
23        int bigArea = 1;
24        int smallArea = 1;
25        for (int i = 1; i <= 6; i++) {
26            if (dCount[d[i]] != 1) continue;
27
28            // 1번만 나온 변으로 큰 사각형 넓이 계산
29            bigArea *= l[i];
30
31            // 그 변과 3 인덱스 떨어진 변으로 짧은 사각형 넓이 계산
32            smallArea *= l[i + 3 > 6 ? i - 3 : i + 3];
33        }
34
35        System.out.println((bigArea - smallArea) * K);
36    }
37}

결과

17620KB / 216ms

Comments

Link copied to clipboard!