728x90
반응형
2024.07.02기준 - 실버3
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 주어진 조규현의 좌표와 거리, 백승환의 좌표와 거리를 이용해 접점을 구하는 문제입니다.
핵심은 큰 원안에 작은 원이 들어갔을때 생기는 변수를 확인하는게 핵심이라고 생각합니다.
1. 조규현과 백승환의 거리를 측정했습니다.
jobadis = Math.sqrt(Math.pow(jox - bax, 2) + Math.pow(joy - bay, 2)); // 조규현과 백승환의 거리
2. ( 조규현과 백승환의 거리)가 0이라면 (2명과 류재명)의 거리가 같지 않는 이상 접점이 생길 수 없어 같은면 -1, 다르면 0을 출력합니다.
2-1. 거리가 0이면서 2명과 류재명의 거리가 같지 않다면.
접점이 생길 수 없는 구조입니다.
2-2 만약, 거리가 0 일때 2명과 류재명의 거리가 서로 같다면,
원이 동일하게 접하게 되어 무수히 많은 접점이 생깁니다.
3. ( 조규현과 백승환의 거리)가 (2명과 류재명)의 거리와 같다면 서로 접점할 수 있는 경우는 한가지 밖에 없어 1을 출력합니다.
4. ( 조규현과 백승환의 거리)가 (2명과 류재명)의 거리보다 크다면 서로 접점을 할 수 없게 되어 0을 출력합니다.
5. ( 조규현과 백승환의 거리)가 (2명과 류재명)의 거리보다 작다면 3가지 경우가 있습니다.
5-1. 작은 원이 큰 원 안쪽에서 접점했을때에는 1을 출력합니다.
if (jobadis + Math.min(jor, bar) == Math.max(jor, bar)) { // 작은 원이 큰 원 안쪽에서 접점했을뗴
sb.append(1);
}
5-2. 작은 원이 큰 원 안쪽에 완전히 들어가 버리면 접점이 생길수 없어 0을 출력합니다.
if (jobadis + Math.min(jor, bar) == Math.max(jor, bar)) { // 작은 원이 큰 원 안쪽에서 접점했을뗴
sb.append(1);
} else if (jobadis + Math.min(jor, bar) < Math.max(jor, bar)) { // 작은 원이 큰 원아에 다 들어갈때
sb.append(0);
}
5-3. 작은 원이 큰 원 밖에 있다면 총 접점이 2개가 생겨 2를 출력합니다.
if (jobadis + Math.min(jor, bar) == Math.max(jor, bar)) { // 작은 원이 큰 원 안쪽에서 접점했을뗴
sb.append(1);
} else if (jobadis + Math.min(jor, bar) < Math.max(jor, bar)) { // 작은 원이 큰 원아에 다 들어갈때
sb.append(0);
} else { // 작은 원이 큰 원 밖에 있을때.
sb.append(2);
}
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(br.readLine()); // 테스트 케이스 개수
int jox, joy, jor, bax, bay, bar;
double jobadis;
StringTokenizer st;
while (t-- > 0) {
st = new StringTokenizer(br.readLine());
jox = Integer.parseInt(st.nextToken()); // 조규현의 x좌표
joy = Integer.parseInt(st.nextToken()); // 조규현의 y좌표
jor = Integer.parseInt(st.nextToken()); // 조규현과 류재명의 거리
bax = Integer.parseInt(st.nextToken()); // 백승환의 x좌표
bay = Integer.parseInt(st.nextToken()); // 백승환의 y좌표
bar = Integer.parseInt(st.nextToken()); // 백승환과 류재명의 거리
jobadis = Math.sqrt(Math.pow(jox - bax, 2) + Math.pow(joy - bay, 2)); // 조규현과 백승환의 거리
if (jobadis == 0) { // 같은 곳에 있을떄
if (jor == bar) { // 거리가 같은 면 있을 수 있는 곳은 무수히 많다.
sb.append(-1);
} else { // 접점이 아예 없다.
sb.append(0);
}
} else if (jobadis == jor + bar) { // 조규현과 백승환의 거리와 2명고 류재명의 거리를 더 했을 떄, 같다면 접점 밖에 없다.
sb.append(1);
} else if (jobadis > jor + bar) { // 더 크다면 접점이 생길 수 없다.
sb.append(0);
} else { // 더 작다면
if (jobadis + Math.min(jor, bar) == Math.max(jor, bar)) { // 작은 원이 큰 원 안쪽에서 접점했을뗴
sb.append(1);
} else if (jobadis + Math.min(jor, bar) < Math.max(jor, bar)) { // 작은 원이 큰 원아에 다 들어갈때
sb.append(0);
} else { // 작은 원이 큰 원 밖에 있을때.
sb.append(2);
}
}
sb.append("\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BEAKJOON / 백준 - JAVA 2052번 지수연산 (2) | 2024.07.03 |
---|---|
BAEKJOON / 백준 - JAVA 1015번 수열 정렬 (0) | 2024.07.03 |
BAEKJOON / 백준 - JAVA 1049번 기타줄 (0) | 2024.07.01 |
BAEKJOON / 백준 - JAVA 15966번 군계일학 (0) | 2024.06.30 |
BAEKJOON / 백준 - JAVA 29197번 아침 태권도 (0) | 2024.06.29 |