문제
세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.
입력
세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.
출력
직사각형의 네 번째 점의 좌표를 출력한다.
추상화
일반 사각형의 나머지 한 점을 구하는 것은 여러가지 답이 나올 수 있을 것이다
하지만 문제의 제한조건은 너무 명확했다.
1) 직사각형일 것
2) 축에 평행하다
이 두개의 조건으로 인해 다음 조건이 성립한다
3) 각 x, y좌표는 각각 두번씩 사용된다
직사각형은 왼쪽x, 오른쪽x, 아래y, 위y 총 4개 종류의 좌표로 구성되며 각각 2번씩 사용된다
입력값은 이중에서 6개를 알려준다. 사용되지 않은 좌표값을 입력하기만 하면된다
확장성
if문을 통해 크기가 3인 배열을 만들고 경우의 수를 나누어 각각을 비교할 수 있다
→ 1과 2가 같은 경우, 2와 3이 같은 경우, 1과 3이 같은 경우
하지만 위 방식은 이 문제에만 한정된다. 확장성을 위한 배열 논리문으로 풀어보았다
1) 크기가 3인 배열을 만든다: 하나는 논리, 다른 하나는 숫자이다. x, y에 대하여 각각 만든다
2) 값을 집어넣고 반복문을 통해 현재 index가 아닌 다른 index의 값과 겹치게 되면 둘 모두의 index를 논리배열에 표기
3) 표기되지 않은 값을 찾아 출력한다
import java.io.*;
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;
int[] x = new int[3];
int[] y = new int[3];
boolean[] overlapX = new boolean[3];
boolean[] overlapY = new boolean[3];
int X=0,Y=0; //출력할 값
for(int i =0; i<3; i++) {
st = new StringTokenizer(br.readLine(), " ");
x[i] = Integer.parseInt(st.nextToken());
y[i] = Integer.parseInt(st.nextToken());
}
for(int i =0; i<3;i++) {
for(int j =0; j<3; j++) {
if(i != j) {
// 자기와 다른 index의 값과 같을 때, 해당 값들을 중복으로 표시해준다
if(x[i]==x[j]) {
overlapX[i] = true;
overlapX[j] = true;
}
if(y[i]==y[j]) {
overlapY[i] = true;
overlapY[j] = true;
}
}
}
}
for(int i =0; i<3; i++) {
if(overlapX[i] == false) {
X = x[i];
}
if(overlapY[i] == false) {
Y = y[i];
}
//중복이 아닌 변수를 골라서 입력한다
}
System.out.print(X+" "+Y);
}
}
'Study > Baekjoon' 카테고리의 다른 글
Baekjoon3053: 택시 기하학 (0) | 2021.10.14 |
---|---|
Baekjoon4153: 직각삼각형 (0) | 2021.10.14 |
Baekjoon1085: 직사각형에서 탈출 (0) | 2021.10.14 |
Baekjoon9020*: 골드바흐의 추측, 여러 방법으로 풀기 (0) | 2021.10.14 |
Baekjoon4948: 베르트랑 공준 (0) | 2021.10.13 |