- Published on
백준 2477: 참외밭
- Authors
- Name
- 신주용
https://www.acmicpc.net/problem/2477
문제 이해
- 참외밭의 넓이를 구하고, 단위 면적당 참외 수를 곱해서 총 참외 개수를 구함.
- 단위 면적은 여서 계산하기 편하게 주어짐.
- 밭의 모양이 ㄱ자를 회전한 모양인 것이 문제.
- 한 꼭짓점에서 출발하여, 반시계 방향으로 변의 길이가 입력으로 주어짐.
접근 방법
- 큰 사각형에서 작은 사각형 넓이를 빼면 됨.
- 큰 사각형, 작은 사각형의 넓이를 구하려면 변의 길이를 알아야 함.
- 큰 사각형 변의 길이?
- 긴 변은 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