https://www.acmicpc.net/problem/2477
문제 이해
- 참외밭의 넓이를 구하고, 단위 면적당 참외 수를 곱해서 총 참외 개수를 구함.
- 단위 면적은 $$1m^2$$여서 계산하기 편하게 주어짐.
- 밭의 모양이 ㄱ자를 회전한 모양인 것이 문제.
- 한 꼭짓점에서 출발하여, 반시계 방향으로 변의 길이가 입력으로 주어짐.
접근 방법
- 큰 사각형에서 작은 사각형 넓이를 빼면 됨.
- 큰 사각형, 작은 사각형의 넓이를 구하려면 변의 길이를 알아야 함.

- 큰 사각형 변의 길이?
- 긴 변은 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