코딩 테스트에서 다각형의 면적을 구하는 문제는 알고리즘과 기하학에 대한 깊은 이해를 요구합니다. 이 글에서는 다각형의 면적을 계산하는 문제를 제시하고, 이를 해결하기 위한 접근 방법, 알고리즘, 코드 설명을 상세히 다룰 것입니다.
문제 설명
문제: 정다각형의 꼭짓점 좌표가 주어졌을 때, 이 다각형의 면적을 구하는 프로그램을 작성하시오. 각 꼭짓점은 시계방향 또는 반시계방향으로 연결된 순으로 주어진다. 좌표는 2차원 평면에서 표현된다.
입력: 첫째 줄에 정점의 개수 n (3 ≤ n ≤ 1000)이 주어진다. 그 다음 n개의 줄에 각 정점의 x, y 좌표가 주어진다.
출력: 마지막 줄에 소수점 아래 두 자리까지 반올림한 면적을 출력한다.
문제 풀이 접근 방법
다각형의 면적을 구하는 알고리즘 중 하나는
쇼벨(Shoelace) 공식을 이용하는 방법입니다. 이 방법은 다각형의 꼭짓점 좌표가 주어졌을 때, 해당 면적을 효율적으로 계산할 수 있습니다. 이 방법은 시계방향 또는 반시계방향으로 연결된 다각형의 꼭짓점에서 면적을 구하는 공식을 기반으로 합니다.
면적 계산 공식은 다음과 같습니다:
Area = 0.5 * | Σ (xi * yi+1 - yi * xi+1) |
여기서 i는 0부터 n-1까지의 정수이며, (xn, yn)는 (x0, y0)로 연결됩니다. 이 공식을 통해 다각형의 면적을 쉽게 계산할 수 있습니다.
C# 구현 단계
이제 주어진 알고리즘을 C#으로 구현해보겠습니다. 구현 단계는 다음과 같습니다:
1. 입력 처리
가장 먼저, 사용자로부터 다각형의 꼭짓점 개수와 각 꼭짓점의 좌표를 입력받습니다.
2. 면적 계산
쇼벨 공식을 이용하여 입력된 좌표로 면적을 계산합니다.
3. 결과 출력
계산된 면적을 소수점 아래 두 자리까지 반올림하여 출력합니다.
코드 구현
using System;
class Program
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
double[,] points = new double[n, 2];
// 좌표 입력 받기
for (int i = 0; i < n; i++)
{
string[] input = Console.ReadLine().Split();
points[i, 0] = double.Parse(input[0]);
points[i, 1] = double.Parse(input[1]);
}
double area = CalculatePolygonArea(points, n);
Console.WriteLine("{0:F2}", Math.Abs(area));
}
static double CalculatePolygonArea(double[,] points, int n)
{
double area = 0;
for (int i = 0; i < n; i++)
{
int next = (i + 1) % n; // 다음 점의 인덱스
area += points[i, 0] * points[next, 1];
area -= points[next, 0] * points[i, 1];
}
return area * 0.5; // 면적
}
}
코드 설명
– 포인트 정의: 입력받은 좌표를 저장하기 위해 2D 배열 points를 선언합니다.
– 좌표 입력: for 루프를 통해 사용자로부터 x, y 값을 입력받습니다.
– 면적 계산: CalculatePolygonArea 메서드에서 쇼벨 공식을 통해 면적을 계산합니다. 각 꼭짓점의 좌표를 사용하여 면적을 구하고, 마지막으로 0.5를 곱하여 최종 면적을 반환합니다.
– 출력: 면적을 소수점 아래 두 자리까지 출력합니다. Math.Abs() 함수를 사용하여 면적이 부정적인 경우에도 항상 양의 면적을 출력합니다.
예제
입력 예시:
4
0 0
4 0
4 3
0 3
출력 예시:
12.00
위의 예시에서는 사각형의 면적을 계산하는 것으로 0,0에서 시작하여 4,0으로 가고, 4,3으로 이어지며, 마지막으로 0,3으로 돌아오는 정사각형을 형성합니다. 해당 사각형의 면적은 4*3=12가 됩니다.
마무리
이번 글에서는 C#을 사용하여 다각형의 면적을 계산하는 방법을 배워보았습니다. 다각형 면적 계산 문제는 다양한 코딩 테스트에서 자주 출제되는 문제이며, 알고리즘적 사고를 기를 수 있는 좋은 기회입니다. 알고리즘 문제를 풀 때는 항상 다양한 접근 방식을 생각해보는 것이 중요합니다. 다음 시간에는 다른 알고리즘 문제를 통해 더 많은 경험을 쌓아가길 바랍니다.