💻 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;
}