본문 바로가기

백준 문제풀기/JAVA

[백준 1004 JAVA 자바] 어린왕자

 

"어린 왕자가 거쳐야 할 최소의 행성계 진입/이탈 횟수를 출력한다"

 

출발점부터 끝점까지 갈 때

통과해야하는 최소의 원의 수를 구하는 문제입니다

 

두 점과 한개의 원의 관계는

아래 그림과같습니다

 

 

1번)

아무 점도 포함하고 있지

않은 관계

 

 

 

 

 

 

 

 

 

 

2번)

하나의 점만 포함하고 있는

관계

 

 

 

 

 

 

 

3번)

두 점 모두 포함하고 있는

관계

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

위의 3개 경우에 선을 그어보겠습니다

 

보이는 것 처럼

2번의 경우만 선이 원을 통과하게 됩니다

(하나의 점만을 포함하고 있는 경우)

 

1. 두 점과 원(하나씩)을 비교해서

2. 한개의 점만을 포함한다면 (중점과 반지름을 비교해서)

3. 카운트 += 1을 한다

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

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int n = Integer.parseInt(br.readLine());
		
		for(int i=0; i<n; i++) {
			StringTokenizer 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 m = Integer.parseInt(br.readLine());
			
			int count = 0;
			
			for(int j=0; j<m; j++) {
				st = new StringTokenizer(br.readLine());
				
				int a = Integer.parseInt(st.nextToken());
				int b = Integer.parseInt(st.nextToken());
				int r = Integer.parseInt(st.nextToken());
				
				int r1 = (a-x1)*(a-x1) + (b-y1)*(b-y1);
				int r2 = (a-x2)*(a-x2) + (b-y2)*(b-y2);
				
				if (r1>r*r && r2>r*r) {
					continue;
				}else if(r1<r*r && r2<r*r) {
					continue;
				}else {
					count += 1;
				}
			}			
			sb.append(count).append("\n");
		}		
		System.out.println(sb);
	}
}

 

for(int i=0; i<n; i++)는

테스트 케이스를 하기위한 반복문입니다

 

StringTokenizer는 입력받은 String을 Token화합니다

띄어쓰기로 구분한다고 생각하면 됩니다

예) String str = "가 나 다 라" 라면

StringTokenizer를 이용하면

0번 = 가

1번 = 나

2번 = 다

3번 = 라

이렇게 저장할 수 있게 됩니다

 

'백준 문제풀기 > JAVA' 카테고리의 다른 글