본문 바로가기
코딩/백준-자바

[자바] 백준 11758번: CCW

by 철없는민물장어 2023. 2. 7.
728x90
반응형

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

 

11758번: CCW

첫째 줄에 P1의 (x1, y1), 둘째 줄에 P2의 (x2, y2), 셋째 줄에 P3의 (x3, y3)가 주어진다. (-10,000 ≤ x1, y1, x2, y2, x3, y3 ≤ 10,000) 모든 좌표는 정수이다. P1, P2, P3의 좌표는 서로 다르다.

www.acmicpc.net

 

오랜만에 수학문제를 풀었다

P1이 원점이라고 했을 때

 

P1,P2,P3 중 두개 이상의 점이 같은 곳에 있는 경우,

또는 x=0이나 y=0 직선 위에 세 점이 있는 경우 => 방향성이 없다

 

P2가 오른쪽(1,4사분면)에 있을 때는... 

{P1과P2를 그어 직선을 하나 만든다.

직선상에 P3가 존재하는 경우 => 세 점이 나란하므로 방향성이 없음

직선보다 윗쪽에 P3가 존재하는 경우=> 반시계방향

직선보다 아랫쪽에 P3가 존재하는 경우=> 시계방향}

 

만약 P2가 왼쪽에(2,3사분면)에 있을 때는...

{P1과P2를 그어 직선을 하나 만든다.

직선상에 P3가 존재하는 경우 => 세 점이 나란하므로 방향성이 없음

직선보다 윗쪽에 P3가 존재하는 경우=> 시계방향

직선보다 아랫쪽에 P3가 존재하는 경우=> 반시계방향}

 

이렇게 생각하고 문제를 풀어봤다.

 

더보기

 

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

public class P11758 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int x1 = Integer.parseInt(st.nextToken());
		int y1 = Integer.parseInt(st.nextToken());

		// P2,P3은 P1의 상대위치로 저장함
		st = new StringTokenizer(br.readLine());
		int x2 = Integer.parseInt(st.nextToken()) - x1;
		int y2 = Integer.parseInt(st.nextToken()) - y1;

		st = new StringTokenizer(br.readLine());
		int x3 = Integer.parseInt(st.nextToken()) - x1;
		int y3 = Integer.parseInt(st.nextToken()) - y1;

		if ((x2 == 0 && x3 == 0) || (y2 == 0 && y3 == 0) || (x2 == 0 && y2 == 0) || (x3 == 0 && y3 == 0)
				|| (x2 == x3 && y2 == y3)) {
			// 세 점 중 두 점이 같은위치이거나, x=0 또는 y=0인 경우
			System.out.println(0);
		} else if (x2 > 0) {
			int value = (y2 * x3);
			if (value == y3*x2)
				System.out.println(0);
			else if (value < y3*x2) {
				System.out.println(1);
			} else if (value > y3*x2) {
				System.out.println(-1);
			}
		} else {
			int value = (y2  * x3);
			if (value == y3*x2)
				System.out.println(0);
			else if (value < y3*x2) {
				System.out.println(-1);
			} else if (value > y3*x2) {
				System.out.println(1);
			}
		}
	}

}

잘못풀었던 코드

 

x2가 양수인지, 음수인지로 나눠서 풀었는데,

value에 기울기*x3을 할 때

기울기를 구하는 과정에서 나눗셈을 하게되면 값의 정확도가 낮아진다고 해서

나누기를 빼고 비교군에 곱셈으로 넣었다.

 

이 때 고려하지 못한 부분이 있었는데

x2가 음수인 경우에는 양 변에 음수를 곱한 것이므로 부등호가 반대로 돼야했다.

그래서 부등호를 바꾸려는 찰나,

보아하니 부등호를 바꾸면 위의 x2가 양수일 때와 똑같은 형태가 된다.

 

그래서 x2를 양수인지 음수인지 나눌 필요 없이 똑같은 코드로 진행하면 되었다.

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

public class P11758 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int x1 = Integer.parseInt(st.nextToken());
		int y1 = Integer.parseInt(st.nextToken());

		// P2,P3은 P1의 상대위치로 저장함
		st = new StringTokenizer(br.readLine());
		int x2 = Integer.parseInt(st.nextToken()) - x1;
		int y2 = Integer.parseInt(st.nextToken()) - y1;

		st = new StringTokenizer(br.readLine());
		int x3 = Integer.parseInt(st.nextToken()) - x1;
		int y3 = Integer.parseInt(st.nextToken()) - y1;

		if ((x2 == 0 && x3 == 0) || (y2 == 0 && y3 == 0) || (x2 == 0 && y2 == 0) || (x3 == 0 && y3 == 0)
				|| (x2 == x3 && y2 == y3)) {
			// 세 점 중 두 점이 같은위치이거나, x=0 또는 y=0인 경우
			System.out.println(0);
		} else {
			int value = (y2 * x3);
			if (value == y3 * x2)
				System.out.println(0);
			else if (value < y3 * x2) {
				System.out.println(1);
			} else if (value > y3 * x2) {
				System.out.println(-1);
			}
		}
	}

}

나눗셈을 사용해서 기울기를 구하면 값이 부정확할 수 있기 때문에

나눗셈을 빼고 양변에 곱셈을 취했다.

그랬더니, x2가 오른쪽에 있는지 왼쪽에 있는지 구분할 필요가 없어졌다.(양변에 음수를 곱하면 부등호가 반대로 되기 때문에)

 

........

728x90
반응형

댓글