잉?

[프로그래머스] 직사각형 넓이 구하기 + 다차원 배열(2차원 배열) 본문

알고리즘_Algorism/프로그래머스

[프로그래머스] 직사각형 넓이 구하기 + 다차원 배열(2차원 배열)

Jye_647 2023. 6. 14. 22:14
문제 설명
2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.

 

제한사항
  • dots의 길이 = 4
  • dots의 원소의 길이 = 2
  • -256 < dots[i]의 원소 < 256
  • 잘못된 입력은 주어지지 않습니다.
입출력 예
dots result
[[1, 1], [2, 1], [2, 2], [1, 2]] 1
[[-1, -1], [1, 1], [1, -1], [-1, 1]] 4

import java.util.ArrayList;
import java.util.HashSet;

class Solution {
    public int solution(int[][] a) {
        int answer = 0;
    	
        HashSet<Integer> xc=new HashSet<Integer>();     //x좌표를 담을 set
        for(int i=0; i<4; i++) {
            xc.add(a[i][0]);
            System.out.println(xc);
        }
        ArrayList<Integer> arr1=new ArrayList<Integer>(xc);
        int x1=arr1.get(0);                             //첫번째 x좌표
        int x2=arr1.get(1);                             //두번째 x좌표

        HashSet<Integer> yc=new HashSet<Integer>();     //y좌표를 담을 set
        for(int i=0; i<4; i++) {
            yc.add(a[i][1]);
        }
        ArrayList<Integer> arr2=new ArrayList<Integer>(yc);
        int y1=arr2.get(0);                              //첫번째 y좌표
        int y2=arr2.get(1);                              //두번째 y좌표

        answer=Math.abs((x1-x2)*(y1-y2));		// Math.abs → 절대값 구하는 함수
        return answer;
    } 
}

위의 알고리즘은 HashSet과 Math.abs 함수를 이용하여 풀었다는 것이 핵심이다.

HashSet을 이용하여 중복된 x좌표값을 제거해주었다. 

[[1, 1], [2, 1], [2, 2], [1, 2]]  → 여기서 X좌표는 1, 2, 2, 1인데 중복값을 제거하면 1하고 2이다.

Math.abs 함수를 이용하여 음수값이 나왔을 경우에 절대값을 반환한다.


class Solution {
    public int solution(int[][] a) {
        int answer = 0;
        
        // 편법인데 제한사항에 있는 dots[i]의 최소, 최대길이 만큼 넣어준다. 
        int max_x = -257;
        int min_x = 257;
        int max_y = -257;
        int min_y = 257;

      
        // 이부분이 x좌표를 구하는 부분인데 x좌표를 구하기 위해서는 a[j][i] 배열에서 i값이 0이어야한다.
        // i값을 0,1차례대로 넣어주는것은 y좌표까지 구해오는 것.
        // 예) i0 i1 → i0이 x좌표, i1이 y좌표이다. 
        // [1, 1]
        // [2, 1]
        // [2, 2]
        // [1, 2]

	 // i를 고정값으로 넣어주는 것.
        for (int j = 0; j <4 ; j++) {
                if (a[j][0]>=max_x){
                    max_x=a[j][0];
                }
                if(a[j][0]<=min_x){
                    min_x=a[j][0];
                }
            
        }
        
        // y좌표 구하는 곳
        for (int i = 0; i <4 ; i++) {
            
                if (a[i][1]>=max_y){
                    max_y=a[i][1];
                }
                if(a[i][1]<=min_y){
                    min_y=a[i][1];
                }
            
        }
       
       // 변의 길이를 구한다.
        int x = max_x-min_x;
       
        int y = max_y-min_y;
       
        // 한 변의 길이가 음수일 경우 -를 곱해 양수로 반환
        if(x < 0 || y < 0){
             answer = -(x*y);
        }else{
            answer = x*y;
        }
       
        return answer;
    }
}

위의 알고리즘은 HashSet과 Math.abs 함수 없이 해결한 알고리즘이다.

Comments