코딩하는 해달이

[백 준 Java] 1485번 : 정사각형 본문

개인 공부/백준

[백 준 Java] 1485번 : 정사각형

코딩하는 해달 2023. 3. 28. 13:54

문제 설명

네 점이 주어졌을 때, 네 점을 이용해 정사각형을 만들 수 있는지 없는지를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 네 줄로 이루어져 있으며, 점의 좌표가 한 줄에 하나씩 주어진다. 점의 좌표는 -100,000보다 크거나 같고, 100,000보다 작거나 같은 정수이다. 같은 점이 두 번 이상 주어지지 않는다.


출력

각 테스트 케이스마다 입력으로 주어진 네 점을 이용해서 정사각형을 만들 수 있으면 1을, 없으면 0을 출력한다.

 

알고리즘

푼 방법

네 개의 점으로 만들 수 있는 모든 변의 길이를 구한 후 집합을 통해 길이가 다른 변이 두 개일 경우에는 정사각형이라 할 수 있다.

풀이코드

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

public class Main {
    List<List<Point>> pointGroup = new ArrayList<>();
    List<Rectangle> rectangles = new ArrayList<>();

    Main(List<List<Integer>> list) {

        for(int i = 0; i < list.size(); i+=4) {
            List<Point> points = new ArrayList<>();
            for(int j = i; j < i + 4; j++) {
                Point point = new Point(list.get(j).get(0), list.get(j).get(1));
                points.add(point);
            }
            pointGroup.add(points);
        }

        for (List<Point> pg : pointGroup) {
            Rectangle r = new Rectangle(pg.get(0),pg.get(1),pg.get(2),pg.get(3));
            rectangles.add(r);
        }

        for (Rectangle r : rectangles) {
            System.out.println(r.isSquare());
        }
    }

    public class Point
    {
        int x, y;

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

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

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

    public class Rectangle {
        private List<Point> points = new ArrayList<>();
        private Set<Double> distanceSet = new HashSet<>();

        public Rectangle(Point p1, Point p2, Point p3, Point p4) {
            points.add(p1);
            points.add(p2);
            points.add(p3);
            points.add(p4);
            setDistances();
        }

        private void setDistances() {
            Double distance;
            for(int i = 0; i < points.size() - 1; i++) {
                for(int j = i + 1; j < points.size(); j++) {
                    distance = points.get(i).toDistance(points.get(j));
                    distanceSet.add(distance);
                }
            }
        }

        public void print() {
            System.out.println(distanceSet);
        }

        public Integer isSquare() {
            return (distanceSet.size()==2) ? 1 : 0;
        }
    }

    public static void main(String[] args) throws IOException {

        List<List<Integer>> list = new ArrayList<>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int t = Integer.parseInt(st.nextToken());

        for(int i = 0; i < t * 4; i++) {
            st = new StringTokenizer(br.readLine());

            int px1 = Integer.parseInt(st.nextToken());
            int py1 = Integer.parseInt(st.nextToken());

            List<Integer> l = new ArrayList<>();
            l.add(px1);
            l.add(py1);
            list.add(l);
        }

        Main main = new Main(list);

    }
}

링크

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

 

1485번: 정사각형

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 네 줄로 이루어져 있으며, 점의 좌표가 한 줄에 하나씩 주어진다. 점의 좌표는 -100,000보다 크거나 같고, 100,000보다 작거나 같

www.acmicpc.net

 

반응형
Comments