https://www.acmicpc.net/problem/2477
2477번: 참외밭
첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지
www.acmicpc.net
위 문제의 해를 구하는 것은 간단하다. 단위 면적 당 얻을 수 있는 참외의 수에 밭의 넓이를 곱해주면 된다.
먼저, 넓이라고 하면 사선 공식을 떠올리기 쉽다. - 사선 공식은 위 문제 뿐만 아니라 수학 문제를 해결하는 데에도 유용하게 쓰이니 알아두면 좋다. 모르는 사람은 링크를 따라가서 공부해보는 것을 추천한다.
밑의 코드의 알고리즘은 다음과 같다.
방위에 따라서 입력되는 거리에 따라서 각 점을 좌표로 생각하게 한다.
방위를 받는 변수는 cdir이며, 동쪽과 북쪽을 +로 잡고 코드를 작성하였다.
이렇게 x좌표와 y좌표가 각 점에 대해서 모두 완전하게 정의되었으므로 사선 공식을 활용하여 밭의 넓이를 구한다. 이렇게 구한 밭의 넓이에 단위 면적당 얻을 수 있는 참외의 양을 곱하여 출력하면 문제의 해를 출력하는 것과 같게 된다.
#include <iostream>
using namespace std;
int k;
int x[7], y[7];
void input()
{
int cdir, dis;
scanf("%d", &k);
for(int i=1; i<7; i++){
scanf("%d %d", &cdir, &dis);
if(cdir==1){
x[i] = x[i-1]+dis;
y[i] = y[i-1];
}
else if(cdir==2){
x[i] = x[i-1]-dis;
y[i] = y[i-1];
}
else if(cdir==3){
x[i] = x[i-1];
y[i] = y[i-1]-dis;
}
else{
x[i] = x[i-1];
y[i] = y[i-1]+dis;
}
}
}
int getarea()
{
int area = 0;
for(int i=1; i<7; i++){
area += x[i]*y[i-1]-x[i-1]*y[i];
}
if(area>=0) return area;
else return (-1)*area;
}
int main()
{
input();
printf("%d\n", k*getarea()/2);
return 0;
}