본문 바로가기
알고리즘/백준

[BAEJOON] 1004 어린 왕자

by 응애~ 개발자 2022. 8. 23.
728x90
반응형

어린왕자 문제

문제 요약

  • 알고리즘 분류: 기하학
  • 문제 난이도: Silver3
  • 문제 내용:
    • 각 테스트케이스에서  출발점 (x1, y1) → 도착점 (x2, y2) 행성계 진입/이탈 횟수를 출력한다.
  • 사이트 주소: https://www.acmicpc.net/problem/1004
 

1004번: 어린 왕자

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주

www.acmicpc.net

문제 풀이

  1. 출발점과 도착점 행성 중심점 거리를 구한다.
  2. 각 거리와 행성의 반지름 길이보다 작을 경우에는 행성안에 있다.
  3. 출발점과 도착점에서 행성 중심점 거리가 행성의 반지름 갈이가 둘 다 작을 경우에는 행성 안에 이동하므로 제외 한다.
  4. 그 외 행성의 반지름 길이가 둘 중 하나 작을 경우 count를 증가 한다.

PYTHON

import sys
input = sys.stdin.readline

for _ in range(int(input())):
    x1, y1, x2, y2 = map(int, input().split())
    cnt = 0
    for _ in range(int(input())):
        x, y, r = map(int, input().split())
        r *= r
        d1 = (x1 - x) ** 2 + (y1 - y) ** 2
        d2 = (x2 - x) ** 2 + (y2 - y) ** 2
        if d1 < r and d2 < r:
            continue
        elif d1 < r or d2 < r: cnt += 1
    print(cnt)

JAVA

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    int T = Integer.parseInt(br.readLine());
	    StringTokenizer st;
		
		for(int t = 0; t < T; t++) {
			st = new StringTokenizer(br.readLine());
			int x1 = Integer.parseInt(st.nextToken());
			int y1 = Integer.parseInt(st.nextToken());
			int x2 = Integer.parseInt(st.nextToken());
			int y2 = Integer.parseInt(st.nextToken());
			int n = Integer.parseInt(br.readLine());
			int count = 0;
			for(int i = 0; i < n; i++) {
				st = new StringTokenizer(br.readLine());
				int x = Integer.parseInt(st.nextToken());
				int y = Integer.parseInt(st.nextToken());
				int r = Integer.parseInt(st.nextToken());
				r = r * r;
				int d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y);
				int d2 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y);
				
				if(d1 < r && d2 < r) {
					continue;
				}else if(d1 < r || d2 < r) {
					count++;
				}
			}
			System.out.println(count);
		}
	    
	}
	    
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BAEJOON] 5058 배수와 약수  (0) 2022.09.06
[BAEJOON] 1358 하키  (0) 2022.08.26
[BAEKJOON] 2738 행렬 덧셈  (0) 2022.08.22
[BAEJOON] 2477 참외밭  (0) 2022.08.18
[BAEKJOON] 11478 서로 다른 부분 문자열의 개수  (0) 2022.08.16