개발/코테문제풀이

백준 9063번 문제풀이 자바

후누피 2023. 5. 3. 13:45
728x90

 

문제는 길지만 이해하기엔 쉬운문제이다.

 

주어진 좌표에서

 

(x축가장큰값-x축가장작은값) x (y축가장큰값-y축가장작은값) 을 해주면 결과값을 얻을 수 있다.

 

문제 자체는 쉽지만 코드로는 쉽지않았다.

 

아래는 코드풀이이다.

 

/*  백준 9063번 문제풀이)

    임씨의 이름이 새겨진 옥구슬의 위치 N 개가 주어질 때에, 임씨에게 돌아갈 대지의 넓이를 계산하는 프로그램을 작성하시오.
    단, 옥구슬의 위치는 2 차원 정수 좌표로 주어지고 옥구슬은 같은 위치에 여러 개가 발견될 수도 있으며,
    x 축의 양의방향을 동쪽, y 축의 양의방향을 북쪽이라고 가정한다.
    예를 들어 위와 같이 (2, 1), (3, 2), (5, 2), (3, 4) 네 점에서 옥구슬을 발견하였다면,
    임씨에게 돌아갈 대지는 (2, 1), (5, 1), (2, 4), (5, 4)를 네 꼭짓점으로 하는 직사각형이며, 넓이는 (5 - 2) × (4 - 1) = 9 가 된다.

    입력)
    첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다.
    이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다.
    각각의 좌표는 -10,000 이상 10,000 이하의 정수이다.

    출력)
    첫째 줄에 N 개의 점을 둘러싸는 최소 크기의 직사각형의 넓이를 출력하시오.
 *
 */
package test_0503;

import java.util.ArrayList;
import java.util.Map;
import java.util.Scanner;
import java.util.AbstractMap.SimpleEntry;

import javax.swing.RowFilter.Entry;


public class test_0503_3 {
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        System.out.print("N값을 입력하세요");
        int N = scan.nextInt();
        ArrayList <Map.Entry<Integer,Integer>> N_list = new ArrayList<>();
       
        //N_list에 map객체로써 x와 y값이 들어간다.
        for(int i=0; i<N; i++){
            System.out.print("x와 y값을 입력하세요.");
            int x = scan.nextInt();
            int y = scan.nextInt();
            N_list.add(new SimpleEntry<>(x,y));
        }
        //minX,minY에 MAX_VALUE로 설정해주고
        //maxX,maxY에 MIN_VALUE로 설정해준다.
        int minX = Integer.MAX_VALUE , maxX = Integer.MIN_VALUE;
        int minY = Integer.MAX_VALUE , maxY = Integer.MIN_VALUE;
       
       
        for(Map.Entry<Integer,Integer> entry : N_list){
            //map의 형태는 key,value의 형태이기때문에
            //N_list에 x는 key의값으로 y는 value의 값으로 들어가있기때문에 재설정해준다.
            int x = entry.getKey();
            int y = entry.getValue();
            // 처음 반복문이돌때 minX는 최대값으로 설정되어있기때문에 minX가 크면 x값으로 수정된다.
            // 결국, 반복문이 다 돌게되면 minX는 x값중 최솟값으로 수정된다.
            if(x<minX)  minX=x;
            if(x>maxX)  maxX=x;
            if(y<minY) minY=y;
            if(y>maxY) maxY=y;
        }
        //마지막으로 땅의 넓이를 구하기위해 가장큰값-작은값 * 가장큰값-가장작은값을 해준다.
        int result = (maxX-minX)*(maxY-minY);
        System.out.print(result);
    }
}

 

요약하자면,

 

처음 N값을 입력받아 N만큼 반복문을 통해

 

N_list에 x와y의 값을 넣어준다.

 

그리고, minX,Y,maxX,Y를 만들어

 

반복문을통해

 

입력된 x,y값과 비교하여 

 

최댓값,최솟값을 구하고

 

구한 최댓값 최솟값을 계산하여

 

출력해주었다.

 

자세한 코드설명은 

 

코드와 함께 주석처리해주었다.

 

 

결과는 아래와 같다.

 

728x90