[백준] 3009번 : 네 번째 점 - Java(자바)

이정우·2022년 2월 10일
0

백준

목록 보기
30/32

Step 0. 해답 코드

import java.util.*;

public class FourDot {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<Integer> list_x = new ArrayList<>();
        List<Integer> list_y = new ArrayList<>();
        int x, y; //x, y값
        for (int i = 0; i < 3; i++) {
            x = sc.nextInt();
            y = sc.nextInt();
            if (list_x.contains(x)) { //x 값이 기존의 list_x에 존재하는가?
                list_x.remove(list_x.indexOf(x)); //존재하면 해당 값을 삭제해줌.
                x = 0; //삭제 후 0값을 대체제로 넣어줌.
            }
            if (list_y.contains(y)) {
                list_y.remove(list_y.indexOf(y));
                y = 0;
            }
            list_x.add(x);
            list_y.add(y);
        }
        //대체제로 넣은 0을 삭제해줌.
        while (list_x.remove(Integer.valueOf(0))); //remove함수는 요소 삭제 후
        // true(삭제 성공), false(삭제 할 게 없음) 리턴. 또한 remove 매개변수로 그냥 int 값을 주면
        //해당 위치 값을 삭제해버림 그러므로 Integer(object) 객체를 넘겨줌.
        while (list_y.remove(Integer.valueOf(0)));
        System.out.println(list_x.get(0) + " " + list_y.get(0));
    }
}

이번 문제는 세 점의 좌표를 입력 받은 후 축에 평행한 직사각형을 만들기 위해 필요한 네 번재 점의 좌표를 구하는 문제였습니다.

Step 1. 문제 접근

문제에서 축에 평행한 직사각형을 찾는 문제이기에 입력된 필요한 총 네 개의 점들은 각각 x, y축의 값들이 2개씩 중복 된다는 점을 이용했습니다. 예를 들어 첫 예제 입력을 보면 5,5 || 5,7 || 7, 5 가 입력되었습니다. x축에서 5가 2번 나오고 7이 한 번 나왔으므로 마지막 네 번째 점은 7이 됩니다. y축도 똑같은 원리로 7이 되는 것을 알 수 있습니다.

Step 2. 문제 해결

문제 접근 방법은 알았으니 기술적인 측면에서 어떤 방식으로 풀지 생각했고 ArrayList를 통해 중복된 값이 존재하면 해당 값을 0으로 대체하고 나중에 0 값들을 지운 후 남는 값을 출력했습니다.

for (int i = 0; i < 3; i++) {
            x = sc.nextInt();
            y = sc.nextInt();
            if (list_x.contains(x)) { //x 값이 기존의 list_x에 존재하는가?
                list_x.remove(list_x.indexOf(x)); //존재하면 해당 값을 삭제해줌.
                x = 0; //삭제 후 0값을 대체제로 넣어줌.
            }
            if (list_y.contains(y)) {
                list_y.remove(list_y.indexOf(y));
                y = 0;
            }
            list_x.add(x);
            list_y.add(y);
        }

우선 for 문을 세 번 돌려 값들을 입력받았습니다. 이때 if문을 x, y에 각각 사용하여 x값이 arraylist에 존재하는지 확인했고 존재하면 해당 값을 0으로 바꿔줘서 add 시켜줬습니다.

while (list_x.remove(Integer.valueOf(0)));
while (list_y.remove(Integer.valueOf(0)));
 System.out.println(list_x.get(0) + " " + list_y.get(0));

for 문이 끝난 후 0 값들을 삭제 후 get메서드를 사용하여 값을 출력했습니다.
이때 while문에는 remove 메서드의 삭제하지 못 했다면 false를 반환하는 성질을 사용했고 remove 메서드의 매개변수 값은 int형이 오면 index를 찾아가기 때문에 object 형인 Integer을 사용했습니다.

Step 3. 느낀 점

오랜만에 arraylist를 사용해서 문제를 풀 수 있어서 좋은 시간이었습니다. 문제 자체는 어렵지 않았는데 여러 기초적인 상식들과 사고력을 기를 수 있던 거 같습니다.

출처 : 백준 3009번 https://www.acmicpc.net/problem/3009

Git 주소 : https://github.com/LeejeongwooKuma/BaekJoon/blob/master/src/com/leejeongwoo/basicmath2/FourDot.java

profile
프로그래밍 공부 중!

0개의 댓글