[백준] 3009번 : 네 번째 점 - JAVA [자바]
https://www.acmicpc.net/problem/3009
3009번: 네 번째 점
문제 세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오. 입력 세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다. 출력 직사각형의 네 번째 점의 좌표를 출력한다. 예제 입력 1 복사 30 20 10 10 10 20 예제 출력 1 복사 30 10...
www.acmicpc.net
- 문제
매우 간단한 문제다!
※ 주의할 점
- 각 점의 좌표는 3개가 주어진다
- 3가지 방법을 이용하여 풀이한다.
기본 알고리즘은 배열을 이용하여 풀 것이다. 다만 입력을 달리하여 풀어보려 한다.
입력은 Scanner 와 BufferedReader 을 통한 방법으로 보여줄 것이다.
- 알고리즘
기본적인 알고리즘은 이렇다.
직사각형을 만들기 위해서는 4개의 좌표와 서로 다른 x 및 y 좌표를 필요로 한다.
무슨말인가 하면 예로들어 직사각형을 구성하는 4개의 좌표가 아래와 같다고 생각해보자.
(2, 1), (4, 1), (2, 3), (4, 3) 이 있다.
그럼 x좌표의 종류는 2, 4 이렇게 2개가 있고,
y좌표 또한 1, 3 이렇게 2개가 구성되게 된다.
즉, 3개의 좌표가 주어질 때, 나머지 하나 좌표를 찾기 위해서는 x 가 쌍을 이루지 않는 좌표가 나머지 좌표의 x좌표가 되고, y좌표 또한 쌍을 이루지 않는 y좌표가 나머지 좌표의 y가 될 것이다.
결국 쌍을 이루지 않는 각각의 좌표만 찾으면 되는 것이다.
- 풀이
- 방법 1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] coord_1 = { in.nextInt(), in.nextInt() }; // 첫 번째 좌표
int[] coord_2 = { in.nextInt(), in.nextInt() }; // 두 번째 좌표
int[] coord_3 = { in.nextInt(), in.nextInt() }; // 세 번째 좌표
in.close();
int x;
int y;
// x 좌표 비교 후 쌍을 이루지 않는 x좌표를 저장
// 1번 x좌표와 2번 x좌표 비교
if (coord_1[0] == coord_2[0]) {
x = coord_3[0];
}
// 1번 x좌표와 3번 x좌표 비교
else if (coord_1[0] == coord_3[0]) {
x = coord_2[0];
}
// 2번 x좌표와 3번 x좌표 비교
else {
x = coord_1[0];
}
// y 좌표 비교
// 1번 y좌표와 2번 y좌표 비교
if (coord_1[1] == coord_2[1]) {
y = coord_3[1];
}
// 1번 y좌표와 3번 y좌표 비교
else if (coord_1[1] == coord_3[1]) {
y = coord_2[1];
}
// 2번 y좌표와 3번 y좌표 비교
else {
y = coord_1[1];
}
System.out.println(x + " " + y);
}
}
가장 기본적인 방법이라 할 수 있겠다.
각각의 좌표(coordinate)를 1차원 배열 3개에 각각 저장하고 각 입력받은 좌표에서 x 와 y 가 각각 겹치지 않는 좌표를 저장한 뒤 출력하는 방법이다.
- 방법 2
BufferedReader 을 사용하는 방법이다.
알고리즘은 크게 다르지 않다.
다만 문자열 분리 과정에서 여러 방법이 있을 수 있는데 기본적으로 아래와 같이 필자처럼 StringTokenizer 로 입력받고 int 형으로 타입을 변경하여 배열에 담는 방법이 있고,
다른 방법으로는 br.readLine().split(" "); 을 통해 문자열 배열로 하여 equals 메소드로 비교를 하는 방법도 있다.
두 방법 다 보여주겠다.
[ StringTokenizer 사용 방법 ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int[] coord_1 = { Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()) };
st = new StringTokenizer(br.readLine()," ");
int[] coord_2 = { Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()) };
st = new StringTokenizer(br.readLine()," ");
int[] coord_3 = { Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()) };
int x;
int y;
// x 좌표 비교
// 1번 x좌표와 2번 x좌표 비교
if (coord_1[0] == coord_2[0]) {
x = coord_3[0];
}
// 1번 x좌표와 3번 x좌표 비교
else if (coord_1[0] == coord_3[0]) {
x = coord_2[0];
}
// 2번 x좌표와 3번 x좌표 비교
else {
x = coord_1[0];
}
// y 좌표 비교
// 1번 x좌표와 2번 x좌표 비교
if (coord_1[1] == coord_2[1]) {
y = coord_3[1];
}
// 1번 x좌표와 3번 x좌표 비교
else if (coord_1[1] == coord_3[1]) {
y = coord_2[1];
}
// 2번 x좌표와 3번 x좌표 비교
else {
y = coord_1[1];
}
System.out.println(x + " " + y);
}
}
[ split 사용 방법 ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] coord_1 = br.readLine().split(" ");
String[] coord_2 = br.readLine().split(" ");
String[] coord_3 = br.readLine().split(" ");
String x;
String y;
// x 좌표 비교
// 1번 x좌표와 2번 x좌표 비교
if(coord_1[0].equals(coord_2[0])){
x = coord_3[0];
}
// 1번 x좌표와 3번 x좌표 비교
else if (coord_1[0] == coord_3[0]) {
x = coord_2[0];
}
// 2번 x좌표와 3번 x좌표 비교
else {
x = coord_1[0];
}
// y 좌표 비교
// 1번 x좌표와 2번 x좌표 비교
if (coord_1[1] == coord_2[1]) {
y = coord_3[1];
}
// 1번 x좌표와 3번 x좌표 비교
else if (coord_1[1] == coord_3[1]) {
y = coord_2[1];
}
// 2번 x좌표와 3번 x좌표 비교
else {
y = coord_1[1];
}
System.out.println(x + " " + y);
}
}
- 성능
위에서 부터 순서대로
채점 번호 : 19534017 - BufferedReader + split
채점 번호 : 19534010 - BufferedReader + StringTokenizer
채점 번호 : 19534008 - Scanner
- 정리
이번 문제는 그렇게 어렵지 않았다.
풀이 방법도 여러가지가 있으니 한 번 다양하게 시도해보면서 빠른 알고리즘은 무엇인지 한 번씩 비교해보는 것도 좋은 방법일 것 같다.
'JAVA - 백준 [BAEK JOON] > 기하 1' 카테고리의 다른 글
[백준] 1002번 : 터렛 - JAVA [자바] (12) | 2020.05.04 |
---|---|
[백준] 3053번 : 택시 기하학 - JAVA [자바] (4) | 2020.05.03 |
[백준] 4153번 : 직각삼각형 - JAVA [자바] (2) | 2020.05.02 |
[백준] 1085번 : 직사각형에서 탈출 - JAVA [자바] (2) | 2020.04.28 |