알고리즘(백준 등) 공부

SWEA 11112. 셀로판지

posite 2026. 6. 3. 12:07

원의 중심과 반지름이 주어지고, 직사각형의 가로, 세로 범위가 주어질 때, 원과 직사각형이 보이는지 확인하는 문제이다. 하나의 도형이 다른 도형에  완전히 가려지면 보이지 않게 된다.

 

원이 가려지는 경우는 직사각형의 모든 꼭짓점이 원의 중심과의 거리가 원의 반지름보다 크고 가로의 양끝 좌표가 원의 가로의 양끝 좌표보다 크거나 같으며 세로의 양끝 좌표가 원의 세로의 양끝 좌표보다 커야 한다. 직사각형이 가려지는 경우는 원 안에 직사각형이 있는 형태로 직사각형의 모든 꼭짓점이 원의 중심과의 거리가 원의 반지름 이하인 경우이다. 이외의 경우는 조금이라도 가려지지 않는 부분이 있는 경우이므로 두 도형 모두 보인다.

double ab = (p-a)*(p-a) + (q-b)*(q-b), ad = (p-a)*(p-a) + (q-d)*(q-d);
double cb = (p-c)*(p-c) + (q-b)*(q-b), cd = (p-c)*(p-c) + (q-d)*(q-d);
if(ab > r*r && ad > r*r && cb > r*r && cd > r*r) {
    if(a <= p - r && c >= p + r && b <= q - r && d >= q + r) {
        sb.append("NY\n");
        continue;
    }
}
if(ab <= r*r && ad <= r*r && cb <= r*r && cd <= r*r) {
    sb.append("YN\n");
    continue;
}
sb.append("YY\n");

 

 

결과 코드는 다음과 같다.

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

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        
        StringBuilder sb = new StringBuilder();
        for (int tc = 1; tc <= T; tc++) {
            sb.append('#').append(tc).append(' ');
            StringTokenizer st = new StringTokenizer(br.readLine());
            int p = Integer.parseInt(st.nextToken()), q = Integer.parseInt(st.nextToken()), r = Integer.parseInt(st.nextToken());
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken()), b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken()), d = Integer.parseInt(st.nextToken());
            
            //원이 가려질 경우 : 직사각형의 모든 꼭짓점이 (p, q) 와의 거리가 r 보다 크고 a <= p - r b >= p + r c <= q - r d >= q + r
            //직사각형이 가려질 경우 직사각형의 모든 꼭짓점이 (p, q) 와의 거리가 r 보다 작은 경우
            double ab = (p-a)*(p-a) + (q-b)*(q-b), ad = (p-a)*(p-a) + (q-d)*(q-d);
            double cb = (p-c)*(p-c) + (q-b)*(q-b), cd = (p-c)*(p-c) + (q-d)*(q-d);
            if(ab > r*r && ad > r*r && cb > r*r && cd > r*r) {
                if(a <= p - r && c >= p + r && b <= q - r && d >= q + r) {
                    sb.append("NY\n");
                    continue;
                }
            }
            if(ab <= r*r && ad <= r*r && cb <= r*r && cd <= r*r) {
                sb.append("YN\n");
                continue;
            }
            sb.append("YY\n");
        }
        
        br.close();
        System.out.print(sb);
    }
}