Hope Everyone Is Happy

[실버1] 2527. 직사각형 (Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버1] 2527. 직사각형 (Java)

J 크 2023. 8. 23. 23:30
728x90
반응형

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

 

2527번: 직사각형

4개의 줄로 이루어져 있다. 각 줄에는 8개의 정수가 하나의 공백을 두고 나타나는데, 첫 4개의 정수는 첫 번째 직사각형을, 나머지 4개의 정수는 두 번째 직사각형을 각각 나타낸다. 단 입력 직사

www.acmicpc.net

화이팅 ★


※  문제를 요약하면 아래와 같습니다.

▶ 직사각형 왼쪽 아래 꼭짓점 부분의 (x,y) 좌표와 오른쪽 위 꼭짓점 부분의 (p,q) 좌표로 표현 가능

    ex)  x=3, y=2 , p=9, q=8 인 직사각형

위와 같은 좌표로 주어지는 직사각형 2개를 입력 받아 겹치는 부분의 특성에 따라 4가지의 경우로 분류

    1. 두 개의 직사각형의 면들이 겹침

    2. 두 개의 직사각형이 선분 하나로만 겹치는 경우

    3. 두 개의 직사각형이 점 하나로만 겹치는 경우

    4. 두 개의 직사각형이 안 겹치는 경우

 Input : 4개의 줄로 구성, 각 줄에는 x,y,p,q 좌표가 2번 주어짐

Output : 4개의 줄에 각각 주어진 두개의 직사각형의 관계를 아래와 같이 비교하여 출력

     a : 1번 특성, b : 2번 특성, c: 3번 특성, d : 4번 특성


◈ Input

3 10 50 60 100 100 200 300
45 50 600 600 400 450 500 543
11 120 120 230 50 40 60 440
35 56 67 90 67 80 500 600

◈ Output

d
a
a
b

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

두 직사각형의 가장 왼쪽 X 좌표 중 큰 값에서 가장 오른쪽 X 좌표중 작은 값을 뺐을 때의 결과와

    두 직사각형의 가장 밑 Y좌표 중 큰 값에서 가장 위 Y좌표 중 작은 값을 뺐을 때 결과를 통해

    두 직사각형의 관계를 파악

    :  (Max Left X - Min Right X > 0 또는 Max Bot Y - MaxBot Y > 0) : 두 사각형은 만나지 않음

    :  (Max Left X - Min Right X == 0 또는 Max Bot Y - MaxBot Y == 0) : 두 사각형은 한 점에서 겹침

    :  (Max Left X - Min Right X < 0 또는 Max Bot Y - MaxBot Y < 0) : 두 사각형은 면에서 겹침

위 3가지 조건 외에는 선분에서 만나는 걸로 판정


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

public class Main {
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int x1 = 0, y1 = 0, p1 = 0, q1 = 0;
		int x2 = 0, y2 = 0, p2 = 0, q2 = 0;
		// 입력 받구~
		for(int i = 0; i < 4; i++) {
			StringTokenizer st = new StringTokenizer(bReader.readLine());
			x1 = Integer.parseInt(st.nextToken()); 
			y1 = Integer.parseInt(st.nextToken()); 
			p1 = Integer.parseInt(st.nextToken()); 
			q1 = Integer.parseInt(st.nextToken()); 
			
			x2 = Integer.parseInt(st.nextToken()); 
			y2 = Integer.parseInt(st.nextToken()); 
			p2 = Integer.parseInt(st.nextToken()); 
			q2 = Integer.parseInt(st.nextToken()); 

			int nMaxLeftX = x1 > x2 ? x1 : x2;
			int nMinRightX = p1 < p2 ? p1 : p2;
			int nMaxBottomY = y1 > y2 ? y1 : y2;
			int nMinTopY = q1 < q2 ? q1 : q2;
			
			int nXGap = nMaxLeftX - nMinRightX;
			int nYGap = nMaxBottomY - nMinTopY;
			
			if(nXGap > 0 || nYGap > 0)
				bWriter.write("d");
			else if(nXGap == 0 && nYGap == 0)
				bWriter.write("c");
			else if(nXGap < 0 && nYGap < 0)
				bWriter.write("a");
			else
				bWriter.write("b");
			
			bWriter.write("\n");
		}
		
		bWriter.flush();
		bWriter.close();
	}
}

아침에 갑자기 번뜩여서 풀게 된 문제,,

읽어주셔서 감사합니다!

Good Luck! (피드백 감사합니다!)