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

[BOJ] 1004. 어린왕자 - JAVA

by 2245 2023. 1. 19.

🔗 문제

https://www.acmicpc.net/problem/1004

 

1004번: 어린 왕자

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

www.acmicpc.net

 

🧩 풀이 및 코드

문제 유형 : 수학, 기하학

 

그림에 겁먹을 것 없이 풀이과정은 은근 단순했다.

진입/이탈의 최소 횟수를 구하는 것이기 때문에 출발점과 도착점이 원 밖에 있다면, 진입/이탈 없이 돌아서 가면 된다.

출발점과 도착점이 둘 다 원 내부에 있다면 진입/이탈이 없기 때문에 횟수로 치지 않는다.

즉, 출발점 또는 도착점 중 하나가 원 내부에 있다면 무조건 진입/이탈을 해야 하므로 이 경우의 갯수만 세면 된다.

이 경우는 원의 중심과 출발점, 도착점 각각의 거리를 구했을 때 원의 반지름보다 작다면 각 점이 원 내부에 있다는 뜻이다. 

두 점이 모두 원 내부에 있거나 밖에 있어 진입/이탈이 없는 경우
출발점 또는 도착점이 원 내부에 있어 이탈이 발생하는 경우

 

두 점 사이의 거리를 구하는 공식은 다음과 같다. 

전체 코드

import java.io.*;
import java.util.*;

public class Main_bj_1004_어린왕자 {

	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("res/input_bj_1004.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());
		int start_x=0, start_y=0, end_x=0, end_y=0, N=0, cnt=0, x=0, y=0, r=0;
		
		StringBuilder sb = new StringBuilder();
		while(T-->0) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			start_x = Integer.parseInt(st.nextToken());
			start_y = Integer.parseInt(st.nextToken());
			end_x = Integer.parseInt(st.nextToken());
			end_y = Integer.parseInt(st.nextToken());
			
			N = Integer.parseInt(br.readLine());
			cnt = 0;
			for(int i=0; i<N; i++) {
				st = new StringTokenizer(br.readLine(), " ");
				x = Integer.parseInt(st.nextToken());
				y = Integer.parseInt(st.nextToken());
				r= Integer.parseInt(st.nextToken());
				
				double d1 = Math.sqrt((x-start_x) * (x-start_x) + (y-start_y) * (y-start_y));
				double d2 = Math.sqrt((x-end_x) * (x-end_x) + (y-end_y) * (y-end_y));
				
				if((d1 < r && d2 < r) || (d1 > r && d2 > r)) continue;
				cnt++;
			}
			
			sb.append(cnt).append("\n");
		}
		
		System.out.println(sb.toString());
		br.close();
	}

}

 


Reference

https://blog.itcode.dev/posts/2021/05/22/a1004

 

[백준 / JAVA] 백준 알고리즘 1004번 어린 왕자 - 𝝅번째 알파카의 개발 낙서장

어린 왕자는 소혹성 B-664에서 자신이 사랑하는 한 송이 장미를 위해 살아간다. 어느 날 장미가 위험에 빠지게 된 것을 알게 된 어린 왕자는, 장미를 구하기 위해 은하수를 따라 긴 여행을 하기 시

blog.itcode.dev

https://nahwasa.com/entry/%EB%B0%B1%EC%A4%80-1004-%EC%9E%90%EB%B0%94-%EC%96%B4%EB%A6%B0-%EC%99%95%EC%9E%90-BOJ-1004-JAVA

 

백준 1004 자바 - 어린 왕자 (BOJ 1004 JAVA)

문제 : https://www.acmicpc.net/problem/1004 코드 : https://github.com/NaHwaSa/BOJ_BaekjunOnlineJudge/blob/master/01000/BOJ_1004.java 사실 문제에 있는 복잡한 그림을 보고 쫄지만 않으면 된다. 그냥 시작지점과 끝지점이 각

nahwasa.com

 

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

[BOJ] 2981. 검문 - JAVA  (0) 2023.01.24
[BOJ] 3036. 링 - JAVA  (1) 2023.01.20
[BOJ] 2448. 별 찍기 - 11 - JAVA  (0) 2022.12.16
[BOJ] 1976. 여행 가자 - JAVA  (0) 2022.12.15
[BOJ] 1241. 머리 톡톡 - JAVA  (0) 2022.12.15