렝무식

[백준 3009번] 네 번째 점 (JAVA) 본문

Algorithm/Baekjoon

[백준 3009번] 네 번째 점 (JAVA)

렝9 2023. 1. 12. 18:40

BOJ - [3009] 네 번째 점


image


🖍 점 세개의 좌표가 입력되었을 때, 축에 평행한 직사각형을 만들기 위한 마지막 점의 좌표를 출력하게 하는 문제
(link) 3009 네 번째 점


[풀이 과정]

직사각형의 좌표 특징을 우선 살펴본다.

여러가지 풀이 방법이 있겠지만, 내가 찾은 규칙은 다음과 같다.

좌표 네 개가 주어지고, 각각 x와 y좌표를 나누어 봤을 때 같은 숫자가 두 번 씩 나오면 직사각형을 이룬다.

무슨 말인지 자세히 알아보기 위해 테스트케이스 하나를 예시로 들어보겠다.

(5, 5) (5, 7) (7, 5)라는 테스트 케이스가 주어졌다고 가정한다. 4분면 위에 점을 찍어보면 나머지 점 하나의 좌표는 (7, 7)이라는 것을 금방 알 수 있다.

우선 세 좌표를 x와 y로 나누어서 써보면 x = 5, 5, 7 이고 y = 5, 7, 5 이다.
이때 x에서 5가 두 번 나왔으므로 7이 두 번 나와야 한다. 따라서 네 번째 점의 x좌표는 7이 된다는 것을 알 수 있다.
마찬가지로 y에서도 5가 두 번 나왔으므로 7이 두 번 나와야 한다. 따라서 네 번째 점의 y좌표 역시 7이 된다.

한마디로, 각 좌표들의 값에서 한 번 밖에 나오지 않은 값이 네 번째 점의 좌표가 되겠다.

규칙을 알았으니 코드로는 어떻게 구현해야할지 생각해보겠다.

x와 y좌표를 나누기 위해 이들을 저장할 배열 두개를 선언하고 값을 각각 저장한다. (2차원 배열로 만들어도 될 것 같다)
그리고 배열 내의 값들이 일치하는지 여부를 통해서 좌표값을 구해줄 것이다.

 

우선 x배열 0번째 데이터와 1번째 데이터가 같다면, 우리가 구해야 할 x좌표는 2번째 데이터와 같은 값이다.
만약 위의 조건문에서 걸러졌다면 0번 값과 2번 값이 같거나, 1번 값과 2번 값이 같은 경우인데 각각의 경우에서 값이 다른 나머지 하나의 값을 좌표값으로 정하면 된다.

'값'이라는 단어에 게슈탈트 붕괴가 올 것 같지만 코드를 보면 이해가 빠를 것이다.


[Pseudocode]

1. x좌표 변수 x 선언
2. y좌표 변수 y 선언 
3. 세 점의 x좌표 저장 배열 xArr 선언
4. 세 점의 y좌표 저장 배열 yArr 선언
5. for i=0 부터 3까지 반복
    6. xArr, yArr에 각각 값 저장
7. if(xArr[0] == xArr[1])
    8. x = xArr[2];
9. else
    10. if(xArr[0] == xArr[2])
        11. x = xArr[1]
    12. else
        13. x = xArr[0]
14. if(yArr[0] == yArr[1])
    15. y = yArr[2]
16. else
    17. if(yArr[0] == yArr[2])
        18. y = yArr[1]
    19. else
        20. y = yArr[0]
21. x, y 출력

[Code]

import java.util.*;

/**
 * 백준 3009번
 * 네 번째 점
 * 분류: 구현, 기하학
 */
public class Problem7 {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int x = 0; // 네 번째 점 x좌표
        int y = 0; // 네 번째 점 y좌표
        int[] xArr = new int[3]; // 세 점의 x좌표 저장 배열
        int[] yArr = new int[3]; // 세 점의 y좌표 저장 배열

        // 좌표 채우기
        for(int i=0 ; i<3 ; i++) {
            xArr[i]= input.nextInt();
            yArr[i]= input.nextInt();
        }

        // x좌표 구하기
        if(xArr[0] == xArr[1])
            x = xArr[2];
        else if(xArr[0] == xArr[2])
            x = xArr[1];
        else
            x = xArr[0];

        // y좌표 구하기
        if(yArr[0] == yArr[1])
            y = yArr[2];
        else if(yArr[0] == yArr[2])
            y = yArr[1];
        else
            y = yArr[0];
        }

        System.out.println(x+" "+y);

        input.close();
    }
}

[Result]

image


(2021.07.19 풀이분)

Comments