본문 바로가기
Algorithm

BOJ 2477

by Edward Agape Kim 2023. 4. 3.

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

'Algorithm' 카테고리의 다른 글

탐구 활동 1  (0) 2023.04.07
숫자 뒤집기(S)  (0) 2023.04.04
BOJ 14696  (0) 2023.04.03
BOJ 2506  (0) 2023.04.03
Quiz7_구와 구의 충돌  (0) 2023.03.30