[C] 백준 - 2166번: 다각형의 면적
7월 13일(목) - 기하학 (2166번)
2166번: 다각형의 면적
첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.
www.acmicpc.net
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
최초 생각 정리
- 이전에 풀이했던 "11758번: CCW"의 풀이에 추가를하며 진행을 하면 될 것으로 예상
- N개의 점을 입력받고, 외적 계산을 진행한 다음, 최종적인 계산값의 절댓값을 소수점 첫째 자리까지 출력하면 된다
- 최종출력에서 소수점 첫째 자리까지의 출력을 위해서는 %.1lf를 사용해야하므로, 모든 값들의 형식은 double 로 통일
- N개의 점들의 x,y 좌표를 세트로 입력받아야하므로, 구조체를 선언하여 입력 받는다
- 외적 계산 부분에서는 작은 삼각형들의 넓이의 합을 더해서, 최종적으로 다각형의 넓이를 구해야한다
따라서 기존의 11758번 풀이에서 외적계산 함수의 리턴값을 2로 나누어서 리턴해주며 작은 삼각형의 넓이를 구한다
또한 여러 삼각형들의 넓이의 합을 누적해서 더해야하므로, 첫 번째 x,y 좌표를 기준점으로 잡은 뒤, for문을 돌려준다
- 출력은 최종적인 계산값의 절댓값을 소수점 첫째 자리까지 출력한다
[C] 백준 - 11758번: CCW
7월 6일(목) - 기하학 (11758번) 11758번: CCW 첫째 줄에 P1의 (x1, y1), 둘째 줄에 P2의 (x2, y2), 셋째 줄에 P3의 (x3, y3)가 주어진다. (-10,000 ≤ x1, y1, x2, y2, x3, y3 ≤ 10,000) 모든 좌표는 정수이다. P1, P2, P3의 좌
jh4995.tistory.com
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문제점
1. 최종 출력 부분에서는, 변수 result에 구해놓은 다각형의 넓이를, 절댓값으로 바꾸어야한다
-> 이때 당연하게 <stdlib.h>의 abs 함수를 사용했고, 0.0만이 출력되는 문제가 발생
-> abs 함수의 함수원형을 찾아보았더니 인자로 int 형식만을 받는다는 것을 알게됨
-> 인자로 double 형식을 받아서, 절댓값을 반환해주는 <math.h>의 fabs 함수를 새롭게 알게됨
[C언어/C++] 절대값 함수 abs, fabs에 대해서.
안녕하세요. BlockDMask 입니다. 오늘은 절대값을 구할 수 있는 절대값 함수 abs에 대해서 알아보려고 합니다. 1. C 언어에서의 abs, fabs 함수 (헤더파일과 함수 원형) 2. C++에서의 std::abs 함수 (헤더파일
blockdmask.tistory.com
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
#include <math.h>
typedef struct {
double x;
double y;
}pair;
pair point[10001];
double ccw(double x1, double y1, double x2, double y2, double x3, double y3)
{
double first = (x2 - x1) * (y3 - y1);
double second = (y2 - y1) * (x3 - x1);
return (first - second) / 2;
}
int main(void)
{
int N;
scanf("%d", &N);
for (int i = 1; i <= N; i++)
{
scanf("%lf %lf", &point[i].x, &point[i].y);
}
double result = 0;
for (int i = 2; i <= N - 1; i++)
{
result = result + (ccw(point[1].x, point[1].y, point[i].x, point[i].y, point[i + 1].x, point[i + 1].y));
}
printf("%.1lf", fabs(result));
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이 - 2
(230720 추가 -> CCW 알고리즘에 대해서 제대로 이해한 후 풀이 추가)
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
#include <math.h>
typedef struct {
double x;
double y;
}pair;
pair point[10001];
double ccw(double x1, double y1, double x2, double y2, double x3, double y3)
{
double temp = x1 * y2 + x2 * y3 + x3 * y1;
temp = temp - y1 * x2 - y2 * x3 - y3 * x1;
return (temp / 2);
}
int main(void)
{
int N;
scanf("%d", &N);
for (int i = 1; i <= N; i++)
{
scanf("%lf %lf", &point[i].x, &point[i].y);
}
double result = 0;
for (int i = 2; i <= N - 1; i++)
{
result = result + (ccw(point[1].x, point[1].y, point[i].x, point[i].y, point[i + 1].x, point[i + 1].y));
}
printf("%.1lf", fabs(result));
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ