코딩하는 해달이

[백 준 Java] 3009번 문제 : 네 번째 점 본문

개인 공부/백준

[백 준 Java] 3009번 문제 : 네 번째 점

코딩하는 해달 2023. 3. 5. 15:34

문제 설명

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

 

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.


출력
직사각형의 네 번째 점의 좌표를 출력한다.

 

알고리즘

푼 방법

점을 입력받고, 객체를 만든 다음, 점끼리 이어 선분을 만들었을 때, 선분을 이루지 않는 점을  길이가 가장 긴 선분을 기준으로 대칭이동 시키면 된다.

 

풀이코드

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

public class Main {
    List<Point> points;
    List<Segment> segments;
    public static void main(String[] args) throws IOException {
        List<Double> input = new ArrayList<>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        for(int i = 0; i < 3; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            input.add(Double.parseDouble(st.nextToken()));
            input.add(Double.parseDouble(st.nextToken()));
        }

        Main main = new Main(input);

    }
    Main(List<Double> input) {
        points = new ArrayList<>();
        for(int i = 0; i < input.size(); i += 2) {
            Point point = new Point(input.get(i), input.get(i + 1));
            points.add(point);
        }

        Segment segment = new Segment(points.get(0), points.get(1));
        for(int i = 0; i < points.size() - 1; i++) {
            for (int j = i + 1; j < points.size(); j++) {
                Segment tem = new Segment(points.get(i), points.get(j));
                if (segment.getLength() < tem.getLength()) {
                    segment = tem;
                }
            }
        }

        if(segment.isSlopePositive()) {
            for(Point p : points) {
                if(p.getX() == segment.getPointMaxX() && p.getY() == segment.getPointMinY()) {
                    System.out.println((int) segment.getPointMinX() + " " + (int) segment.getPointMaxY());
                    break;
                } else if(p.getX() == segment.getPointMinX() && p.getY() == segment.getPointMaxY()) {
                    System.out.println((int) segment.getPointMaxX() + " " + (int) segment.getPointMinY());
                    break;
                }
            }
        } else {
            for(Point p : points) {
                if(p.getX() == segment.getPointMaxX() && p.getY() == segment.getPointMaxY()) {
                    System.out.println((int) segment.getPointMinX() + " " + (int) segment.getPointMinY());
                    break;
                } else if (p.getX() == segment.getPointMinX() && p.getY() == segment.getPointMinY()) {
                    System.out.println((int) segment.getPointMaxX() + " " + (int) segment.getPointMaxY());
                    break;
                }
            }

        }


    }

    public class Point {
        private double x;
        private double y;

        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }

        public double toDistance(Point p) {
            return Math.sqrt(Math.pow(Math.abs(this.x - p.x), 2) + Math.pow(Math.abs(this.y - p.y), 2));
        }

        public double getX() {
            return x;
        }
        public double getY() {
            return y;
        }
    }

    public class Segment {
        private Point p1;
        private Point p2;
        private double length;
        private double slope;

        public Segment(Point p1, Point p2) {
            this.p1 = p1;
            this.p2 = p2;
            this.length = p1.toDistance(p2);
            this.slope = (p2.y - p1.y) / (p2.x - p1.x);
        }

        public double getPointMaxX() {
            return Math.max(p1.x, p2.x);
        }

        public double getPointMaxY() {
            return Math.max(p1.y, p2.y);
        }

        public double getPointMinX() {
            return Math.min(p1.x, p2.x);
        }

        public double getPointMinY() {
            return Math.min(p1.y, p2.y);
        }

        public double getLength() {
            return length;
        }

        public boolean isSlopePositive() {
            return slope > 0;
        }
    }

}

링크

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

 

3009번: 네 번째 점

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

www.acmicpc.net

 

반응형
Comments