💻 OnlineJudge/Baekjoon
[백준 / BOJ] C++ 2477 참외밭
스쳐가는비
2022. 7. 18. 10:56
백준 - 단계별로 풀어보기 [2477]
https://www.acmicpc.net/problem/2477
2477번: 참외밭
첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지
www.acmicpc.net
풀이
어떻게 풀어야할까 고민을 많이 한 문제..
큰 사각형에서 작은 사각형의 넓이를 빼는 식으로 문제 해결을 해 보았습니다.
작은 사각형을 구하는 방법은 연속되는 두개의 방향 짝에 끼인 두개의 방향의 길이 곱이 작은사각형 넓이입니다.
그리고 연속되는 두개의 방향짝을 제외한 나머지 길이 두개의 곱이 큰 사각형 넓이입니다.
즉, 큰 사각형의 넓이는 방향이 한번씩만 입력되고, 작은 사각형의 넓이는 방향이 두번씩 입력됩니다.
Code
#include <iostream>
using namespace std;
void main() {
int num;
int arr[6][2];
int cnt[4] = { 0, };
int o = 0, t = 0, h = 0, f = 0;
int s_sqrt = 1;
int b_sqrt = 1;
cin >> num;
for (int i = 0; i < 6; i++) {
cin >> arr[i][0] >> arr[i][1];
switch (arr[i][0])
{
case 1:
o++;
cnt[0] = o;
break;
case 2:
t++;
cnt[1] = t;
break;
case 3:
h++;
cnt[2] = h;
break;
case 4:
f++;
cnt[3] = f;
break;
default:
break;
}
}
int s_1[2] = { 0, };
for (int i = 0; i < 4; i++)
{
if (cnt[i] == 1)
{
s_1[i] = i;
}
}
b_sqrt = arr[s_1[0]][1] * arr[s_1[1]][1];
for (int i = 0; i < 6; i++)
{
int checknum1 = (i + 1) % 6;
int checknum2 = (i + 2) % 6;
if (arr[i][0] == arr[checknum2][0])
s_sqrt *= arr[checknum1][1];
}
cout << ((b_sqrt - s_sqrt) * num) << endl;
}