- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- oauth
- 동적할당
- 로그인
- Java
- python
- 안드로이드
- 알고리즘
- 코딩테스트
- til
- 자료구조
- sql
- 파이썬
- 백준
- Firebase
- C언어
- 정렬
- 연결리스트
- 비주얼 베이직
- 프로그래머스
- 안드로이드 스튜디오
- 프로그래밍 입문
- android studio
- 배열
- 공유대학
- 컴퓨터공학과
- 자바
- 구글 로그인
- C++
- firebase google
Archives
코딩하는 해달이
[백 준 Java] 3009번 문제 : 네 번째 점 본문
문제 설명
세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.
입력
세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 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
반응형
'개인 공부 > 백준' 카테고리의 다른 글
[백 준 Java] 2531번 문제 : 코딩은 체육과목입니다. (0) | 2023.03.08 |
---|---|
[백 준 Java] 25304번 문제 : 영수증 (0) | 2023.03.07 |
[백 준 Java] 1100번 문제 : 하얀 칸 (0) | 2023.03.04 |
[백 준 Java] 1094번 문제 : 막대기 (0) | 2023.03.03 |
[백 준 Java] 10950번 문제 : A+B - 3 (0) | 2023.03.03 |
Comments