** 이 글을 읽음에 앞서 포스팅 된 소스가 100% 정답은 아님을 밝힙니다.
더욱 유능한 분께서 클린 / 최적의 소스를 짜셨을 가능성이 높습니다.
기록용으로 남기며, 참고만 부탁드립니다.
** 백준 알고리즘은 직접 풀이를 해보시는 것을 권장합니다.
● 문제
난이도[티어] : 실버 3
백준 알고리즘 1002번 문제 터렛
https://www.acmicpc.net/problem/1002
● 풀이 방법
좌표평면에서 두 개의 원을 그려 두 원의 접점 개수를 찾는 문제.
두 원의 접점 개수의 Case는 총 4가지 이다.
- 2개 : 두 개의 원이 엇갈리게 겹침.
- 1개 : 두 개의 원이 붙어 있음
- 0개 : 두 개의 원이 서로 완전히 떨어져 있음.
- 무한(-1) : 두 개의 원이 완전히 겹침.
두 원의 상태를 알 수 있는 방법은 두 원의 중심점의 거리와 각 원의 반지름을 통해 알아 낼 수 있다.
두 원의 상태의 Case는 총 6가지 이다.
- Case 1 : 두 개의 원이 완전히 겹침
[ 중심점 거리 0 / 반지름 길이 동일 ]
- Case 2 : 두 개의 원이 외부에서 붙어 있음.
[ 중심점 거리 : 각 원의 반지름 합 / 반지름 길이 상이 ]
- Case 3 : 두 개의 원이 내부에서 붙어 있음.
[ 중심점 거리 : 각 원의 반지름 차 / 반지름 길이 상이 ]
- Case 4 : 두 개의 원이 엇갈리게 겹쳐 있음.
[ 중심점 거리 : 각 원의 반지름 합 보다 작고 차 보단 큼 / 반지름 상관 X ]
- Case 5 : 두 개의 원이 외부에서 완전히 떨어져 있음.
[ 중심점 거리 : 각 원의 반지름 합 보다 큼 / 반지름 상관 X ]
- Case 6 : 두 개의 원이 내부에서 완전히 떨어져 있음.
[ 중심점 거리 : 각 원의 반지름 합 보다 작음 / 반지름 상관 X ]
두 개의 원 중심점 거리는 피타고라스의 정리 식을 대입하며 산출
● 소스 코드
** 아래의 소스에서는 테스트 케이스 값과 각 테스트 케이스에서 주어지는 6개의 값을 사용자로부터 받아 결과값을 한꺼번에 출력하는 구조로 짜여져 있습니다.
** 각 테스트 케이스마다 값을 출력하는 방식을 3번 반복해서 진행해도 문제 푸는데에는 지장이 없습니다.
#include <iostream>
#include <math.h>
int main()
{
//baekjoon No. 1002
int x1, y1, x2, y2, r1, r2;
double real_dist;
int case_cnt = 1;
scanf("%d",&case_cnt);
int result[case_cnt] = {0,};
for(int i=0;i<case_cnt;i++){
scanf("%d %d %d %d %d %d",&x1,&y1,&r1,&x2,&y2,&r2);
real_dist = sqrt((pow(x1 - x2,2)) + (pow(y1 - y2,2)));
if(real_dist < (r1+r2) && real_dist > abs(r1-r2)){
//접점 둘
result[i] = 2;
}
else if(!real_dist && (r1 == r2)){
//완전겹침
result[i] = -1;
}
else if(real_dist == (r1+r2) || real_dist == abs(r1-r2)){
//접점 하나 - 내부 or 외부
result[i] = 1;
}
else if(real_dist > (r1+r2)){
//접점 없음 - 외부
result[i] = 0;
}
if(real_dist < (r1+r2) && real_dist < abs(r1-r2)){
//접점 없음 - 내부
result[i] = 0;
}
}
for(int i=0;i<case_cnt;i++)
printf("%d\n",result[i]);
}
라이브러리를 통해 사용한 함수
제곱근[ 양수 값의 루트 ] : sqrt
#include <math.h>
double sqrt(double x);
제곱 : pow
#include <math.h>
double pow(double x, double y);
절댓값 : abs
#include <stdlib.h>
int abs(int n);
● 결과
'백준 알고리즘' 카테고리의 다른 글
[백준 알고리즘 C/C++] 1005번 문제 풀이 : ACM Craft (0) | 2024.03.11 |
---|---|
[백준 알고리즘 C/C++] 1004번 문제 풀이 : 어린 왕자 (0) | 2024.03.11 |
[백준 알고리즘 C/C++] 1003번 문제 풀이 : 피보나치 함수 (0) | 2024.03.11 |
[백준 알고리즘 C/C++] 1001번 문제 풀이 : A-B (0) | 2024.03.11 |
[백준 알고리즘 C/C++] 1000번 문제 풀이 : A+B (1) | 2024.03.11 |