본문 바로가기

정보올림피아드&알고리즘

참외밭

참외밭

문제

시골에 있는 태양이의 삼촌 댁에는 커다란 참외밭이 있다. 

문득 태양이는 이 밭에서 자라는 참외가 도대체 몇 개나 되는지 궁금해졌다. 

어떻게 알아낼 수 있는지 골똘히 생각하다가 드디어 좋은 아이디어가 떠올랐다. 

 

유레카! 

1㎡의 넓이에 자라는 참외 개수를 헤아린 다음, 참외밭의 넓이를 구하면 비례식을 이용하여 참외의 총개수를 구할 수 있다.


1㎡의 넓이에 자라는 참외의 개수는 헤아렸고, 이제 참외밭의 넓이만 구하면 된다. 

참외밭은 ㄱ-자 모양이거나 ㄱ-자를 90도, 180도, 270도 회전한 모양(┏, ┗, ┛ 모양)의 육각형이다. 

다행히도 밭의 경계(육각형의 변)는 모두 동서 방향이거나 남북 방향이었다. 

밭의 한 모퉁이에서 출발하여 밭의 둘레를 돌면서 밭경계 길이를 모두 측정하였다.

 

 



 


예를 들어 참외밭이 위 그림과 같은 모양이라고 하자. 

그림에서 오른쪽은 동쪽, 왼쪽은 서쪽, 아래쪽은 남쪽, 위쪽은 북쪽이다. 

이 그림의 왼쪽위 꼭지점에서 출발하여, 

반시계방향으로 남쪽으로 30m, 동쪽으로 60m, 남쪽으로 20m, 동쪽으로 100m, 북쪽으로 50m, 서쪽으로 160m 이동하면 

다시 출발점으로 되돌아가게 된다.

 


위 그림의 참외밭 면적은 6800㎡이다. 만약 1㎡의 넓이에 자라는 참외의 개수가 7이라면, 이 밭에서 자라는 참외의 개수는 47600으로 계산된다.


1㎡의 넓이에 자라는 참외의 개수와, 

참외밭을 이루는 육각형의 임의의 한 꼭지점에서 출발하여 반시계방향으로 둘레를 돌면서 지나는 변의 방향과 길이가 순서대로 주어진다. 

 

이 참외밭에서 자라는 참외의 수를 구하는 프로그램을 작성하시오.

 

 

입력형식

첫 번째 줄에 1㎡의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K(1≤K≤20)가 주어진다. 

참외밭을 나타내는 육각형의 임의의 한 꼭지점에서 출발하여 반 시계 방향으로 둘레를 돌면서 지나는 변의 방향과 길이 (1 이상 500 이하의 정수) 가 둘째 줄부터 일곱 번째 줄까지 한 줄에 하나씩 순서대로 주어진다. 

변의 방향에서 동쪽은 1, 서쪽은 2, 남쪽은 3, 북쪽은 4로 나타낸다.

 

출력형식

첫째 줄에 입력으로 주어진 밭에서 자라는 참외의 수를 출력한다.

 

입력 예

7
4 50
2 160
3 30
1 60
3 20
1 100

출력 예

47600

 

소스코드

더보기

#include <stdio.h>

 
int main() {
    int i, cwn, arr[6][2], cc[4] = { 0 };
    int caut[2], top = 0, res;
 
    scanf("%d", &cwn);
 
    for (i = 0; i < 6; i++)
    {
        scanf("%d %d", &arr[i][0], &arr[i][1]);
        if (cc[arr[i][0] - 1] != 0)
            cc[arr[i][0] - 1] = 0;
        else
            cc[arr[i][0] - 1] = i + 1;
    }
 
    for (i = 0; i < 4; i++)
    {
        if (cc[i] == 0)
            continue;
         
        caut[top++] = cc[i] - 1;
    }
 
    res = cwn * (arr[caut[0] % 6][1]* arr[caut[1] % 6][1]- arr[(caut[0]+3) % 6][1]* arr[(caut[1] + 3) % 6][1]);
 
    printf("%d\n", res);
 
    return 0;
}

 

 

최대 가로길이 : 160

최대 세로길이 : 50

 

작은 사각형의 가로길이를 구하기 위해 두개의 세로길이 사이에 있는 가로 길이를 구하면된다.

50 = 30 + 20으로 그사이의 가로길이를 구하는 것으로

최대 세로길이 == arr[i-1] + arr[i+1] 이 같을때 arr[i]번째 길이는 60이 된다.

 

작은 사각형의 세로길이를 구하기 위해 두개의 가로길이 사이에 있는 세로 길이를 구하면된다.

160 = 60 + 100으로 그사이의 세로길이를 구하는 것으로

최대 가로길이 == arr[i-1] + arr[i+1] 이 같을때 arr[i]번째 길이는 20이 된다.

 

 

    for (i = 0; i < 6; i++) {
        if (i % 2 == 0) {
            if (width_max < arr[i])
                width_max = arr[i];
        } else {
            if (height_max < arr[i])
                height_max = arr[i];
        }
    }
 
    for (i = 0; i < 6; i++) {
        if (i % 2 == 0) {
            if (height_max == arr[(i + 5) % 6] + arr[(i + 1) % 6]) 
                width_min = arr[i];
        } else {
            if (width_max == arr[(i + 5) % 6] + arr[(i + 1) % 6]) 
                height_min = arr[i];
        }
    }
    totalsu = (width_max * height_max - width_min * height_min) * su;
    printf("%d\n", totalsu);

 

'정보올림피아드&알고리즘' 카테고리의 다른 글

토마토(초)  (0) 2022.01.26
직사각형  (0) 2022.01.25
숫자 야구  (0) 2022.01.13
경비원  (0) 2022.01.12
빙고  (0) 2022.01.12