자바스크립트 코딩테스트 강좌, 다각형의 면적 구하기

이번 강좌에서는 코딩테스트에서 자주 출제되는 문제 중 하나인 “다각형의 면적 구하기” 문제를 다루어 보겠습니다. 다각형의 면적을 구하는 알고리즘을 자바스크립트로 구현하는 방법에 대해 깊이 있는 학습을 진행할 것입니다.

문제 설명

주어진 다각형의 꼭지점 좌표가 주어졌을 때, 이 다각형의 면적을 계산하는 함수를 작성하시오. 다각형의 꼭지점은 시계 방향 또는 반시계 방향으로 정렬되어 있으며, 꼭지점의 좌표는 평면 좌표계에서 정수로 표현됩니다.

입력

  • 다각형의 꼭지점 수 n (3 ≤ n ≤ 1000)
  • n개의 꼭지점의 좌표 (x1, y1), (x2, y2), ..., (xn, yn)

출력

다각형의 면적을 소수점 아래 두 자리까지 반올림하여 출력한다.

문제 풀이 과정

다각형의 면적을 구하는 방법으로는 다음과 같은 여러 가지가 있습니다. 여기서는 가장 일반적인 “슈뢰더의 공식(또는 다각형 면적 공식)”을 사용하겠습니다. 이 공식을 사용하면 다각형의 면적을 간단하게 구할 수 있습니다.

슈뢰더의 공식

주어진 꼭지점 (x1, y1), (x2, y2), ..., (xn, yn)에 대해서 면적 A는 다음과 같이 계산됩니다:

A = (1/2) * | Σ (xi * yi+1 - yi * xi+1) | 

여기서 i+1은 모듈러 연산을 사용하여 in에 도달할 경우 다시 1로 돌아가게 설정합니다. 이 공식은 다각형의 모든 변의 기여도를 고려하여 면적을 계산합니다.

자바스크립트 코드 구현

위의 공식을 코딩으로 구현해 보겠습니다. 아래에는 자바스크립트로 작성한 코드가 있습니다.


function calculatePolygonArea(vertices) {
    let n = vertices.length;
    let area = 0;

    for (let i = 0; i < n; i++) {
        let x1 = vertices[i][0];
        let y1 = vertices[i][1];
        let x2 = vertices[(i + 1) % n][0];
        let y2 = vertices[(i + 1) % n][1];

        area += (x1 * y2) - (y1 * x2);
    }

    return Math.abs(area / 2).toFixed(2);
}

// 예시
let vertices = [[0, 0], [4, 0], [4, 3], [0, 4]];
console.log(calculatePolygonArea(vertices)); // 12.00

코드 설명

  • calculatePolygonArea 함수는 다각형의 꼭지점 좌표 배열 vertices를 입력받습니다.
  • 다각형의 꼭지점 개수 n를 구합니다.
  • 초기 면적 area를 0으로 설정한 다음, 모든 꼭지점에 대해 면적을 계산합니다.
  • 현재 꼭지점 (xi, yi)와 다음 꼭지점 (xi+1, yi+1)를 사용하여 면적에 기여도를 더합니다.
  • Modulus 연산을 통해 마지막 꼭지점과 첫 번째 꼭지점을 연결하여 면적 계산을 완성합니다.
  • 계산된 면적을 정수로 반올림하여 반환합니다.

테스트 케이스

코드를 확인했다면 다음과 같은 테스트 케이스를 추가해 보겠습니다.


let testVertices1 = [[0, 0], [0, 2], [2, 2], [2, 0]]; //사각형
let testVertices2 = [[0, 0], [4, 0], [4, 3], [0, 4]]; // 불규칙 다각형

console.log(calculatePolygonArea(testVertices1)); // 4.00
console.log(calculatePolygonArea(testVertices2)); // 12.00

정리

이번 강좌에서는 다각형의 면적을 구하는 방법에 대한 이론과 함께 자바스크립트 구현 예시를 살펴보았습니다. 다각형의 면적을 구하는 공식을 이해하고, 이를 실제 코드로 구현하는 과정이 코딩테스트에서 도움이 되리라 생각합니다.

다각형의 면적 구하기 문제는 실제 코딩테스트에서도 자주 출제되므로, 기본적인 이론과 문제 풀이 과정을 확실히 숙지해 두시기 바랍니다. 다음 강좌에서는 다른 알고리즘 문제를 다룰 예정이니 많은 관심 부탁드립니다.