백준 4번째 점

KIMYEONGJUN·2026년 4월 12일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

각 줄은 8개의 실수로 이루어져 있는데 각각 첫 번째 변의 양 끝점의 (x,y) 좌표와 두 번째 변의 양 끝점의 (x,y) 좌표로 구성되어 있다.
모든 좌표는 미터 단위이며 mm까지 나타내야 한다.
또한 모든 좌표값은 -10000~10000의 범위를 갖는다.

각각의 입력에 대해 각 줄에 네 번째 점의 좌표를 미터 단위로 mm까지 나타내어라.

내가 이 문제를 보고 생각해본 부분

주요 좌표를 담는 Point 클래스를 만들고, 두 점 비교를 위한 isSame 메서드를 포함한다.
입력은 BufferedReader로 한 줄씩 받아 StringTokenizer로 숫자들을 분리해 처리해준다.
네 점 중 평행사변형의 인접한 두 변에 해당하는 점들을 특정하기 위해 점들을 맞바꾸는 조건문을 작성했다. 
이는 문제에서 인접 변이 주어졌다는 조건을 만족시키기 위함이다.
4번째 점의 좌표는 평행사변형의 성질을 이용해
D = B + C − A
와 같은 공식을 적용해 계산한다.
출력은 소수점 셋째 자리까지 포맷팅하여 요구사항에 맞게 출력한다.
입력이 없을 때까지 반복하여 여러 케이스를 처리한다.

코드로 구현

package baekjoon.baekjoon_34;

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

// 백준 1894번 문제
public class Main1356 {
    static class Point {
        double x, y;

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

        boolean isSame(Point other) {
            return this.x == other.x && this.y == other.y;
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String input;

        while ((input = br.readLine()) != null && !input.isEmpty()) {
            StringTokenizer st = new StringTokenizer(input);

            Point a = new Point(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));
            Point b = new Point(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));
            Point c = new Point(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));
            Point d = new Point(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));

            if (b.isSame(c)) {
                Point temp = a;
                a = b;
                b = temp;
            } else if (a.isSame(d)) {
                Point temp = c;
                c = d;
                d = temp;
            } else if (b.isSame(d)) {
                Point tempA = a;
                Point tempC = c;
                a = b;
                b = tempA;
                c = d;
                d = tempC;
            }

            double resX = a.x + (b.x - a.x) + (d.x - a.x);
            double resY = a.y + (b.y - a.y) + (d.y - a.y);

            bw.write(String.format("%.3f %.3f%n", resX, resY));
        }

        bw.flush();
        br.close();
        bw.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글