BOJ 3009

2020-02-07

위 문제는 백준 사이트의 알고리즘 3009 문제에 관한 설명입니다.


문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

출력

직사각형의 네 번째 점의 좌표를 출력한다.


import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int arrayX[] = new int[3];
        int arrayY[] = new int[3];

        for(int i=0; i<3; i++){
            arrayX[i] = sc.nextInt();
            arrayY[i] = sc.nextInt();
        }
        findPoint(arrayX);
        findPoint(arrayY);
    }

    public static void findPoint(int array[]){
        if(array[0]==array[1])
            System.out.print(array[2]);
        else if(array[0]==array[2])
            System.out.print(array[1]);
        else
            System.out.print(array[0]);
        System.out.print(" ");

    }
}


제가 푼 소스코드입니다.

코드 설명

배열 arrayX와 arrayY에 좌표 X점과 Y점을 입력합니다.

이후 4번째 X점을 구하기 위해 findPoint메소드를 이용해서 출력합니다.

이때 출력되는 내용은 array[0]~array[2]까지 중에 값이 다른 1가지를 출력시켜야합니다. (직사각형이기 때문)

4번째 Y점에서도 동일하게 반복합니다.

역시나 간단한 문제.

네 번째 점

ps) 문득 갑자기 생각난 내용.

배열을 매개변수로 넘기는 것에 대해서 문득 아리송 했던 점이 있습니다.

그 이유는 C언어 배울당시 그리고 C++을 독학하던 때, 배열은 매개변수로 사용하면 위험하다! 라는 기억이 생각나서 입니다.

그런데 자바에서는 괜찮을까? 하고 찾아보았습니다.

첫째, C에서의 배열은 그룹지어진 메모리이기 때문에 더 큰 메모리를 차지합니다.

따라서 배열의 값을 다른 함수로 전달하려면 해당 함수에서도 동일한 크기의 배열이 필요합니다.

예를들어, 넘어가는 매개변수 배열을 1000Byte크기 일 때,

넘어간 곳에서도 1000Byte가 하나 더 필요하기 때문입니다.

따라서 스택 메모리에 부담을 줄 수 있습니다.

둘째, 메모리에 저장된 데이터를 복사하는 시간이 필요합니다.

이를 위한 실행시간에 대한 부담도 커집니다.

이런 이유들로 포인터를 통해 매게 변수를 선언해 배열의 주소를 받아서 사용했었습니다.

그러나 자바에서의 배열은 C에서의 배열과 다릅니다.

자바에서 배열을 위해 new를 사용해 “객체”를 생성하는데 생성후 사용하면

c언어의 배열처럼 함수 안에서 동작하고 나와도 변경된 값들을 유지할 수 있고,

매개변수로도 전달이 가능해집니다.