본문 바로가기
끄적/Java_CT

[자바 코테] Math.max/min 활용하기

by 밀키스 2021. 9. 28.

프로그래머스 위클리 문제

명함별 사이즈를 리스트에 담아주고 해당 명함들을 담을 케이스의 최적 크기를 구하는 문제.

 

다시 말해, 해당되는 명함들 한정해서 가장 작은 케이스의 크기를 구하는 것.

 

아래는 내가 이 문제를 푼 코드이다.

 

 

 

import java.util.Arrays;
class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        int[][] wh = new int[2][sizes.length];
        int[] wh_max = {0,0};
        for(int i=0; i<sizes.length;i++){
            wh[0][i]=sizes[i][0];
            wh[1][i]=sizes[i][1];
            if(sizes[wh_max[0]][0]<sizes[i][0]){
                wh_max[0]=i;
            }
            if(sizes[wh_max[1]][1]<sizes[i][1]){
                wh_max[1]=i;
            }
        }
        int[] ans = {1,0};
        if(wh[0][wh_max[0]]>=wh[1][wh_max[1]]){
            ans[0]=0;
            ans[1]=1;
        }
        for(int i=0;i<sizes.length;i++){
            if(i==wh_max[ans[0]]){continue;}
            else if(wh[ans[0]][i]<wh[ans[1]][i]){
                wh[ans[1]][i] = sizes[i][ans[0]];
            }
        }
        return Arrays.stream(wh[0]).max().getAsInt()*Arrays.stream(wh[1]).max().getAsInt();
    }
}
  •  wh  라는 변수에 각 명함들의 가로, 세로 크기를 2 X N 크기로 담아주었다.
  •  wh_max  는 각 가로, 세로 크기 중에 가장 큰 값을 갖는 인덱스의 위치를 저장한다.
  •  ans  는 가로, 세로의 Max 값 중, 어떤 값이 크냐에 따라 1과 0의 순서를 달리하는 리스트이다.
  • 그리고 아래의 반복문을 통해 명함의 크기를 담고 있는 리스트들에 변화를 준다
    1. 만일, 가로 최대값이 세로 최대값보다 크다고할 때, 가로 크기를 담는 리스트에 큰값을 몰아준다.
    2. wh 리스트의 각 인덱스별 가로, 세로 크기를 비교하여 가로 크기가 세로 크기보다 작다면, 위치를 바꾼다.
    3. 가로 크기가 최대값이라 가정했기 때문에, 절대 세로값이 가로 맥스치보다 클 수는 없다.

 

그리고 가로, 세로 리스트의 각 최대값을 곱해 답을 도출.

 

 

 

이렇게 해당 문제를 풀었지만... 풀어 놓고 대충 봐도...

 

풀이가 너무 복잡하다...

 

 

그래서 다른 사람의 풀이를 참고하고 다시 복습하였다.

 


 

% Math.max 활용하기 

class Solution {
    public int solution(int[][] sizes) {
        int wh_max = 0;
        int wh_min = 0;
        for(int[] wh : sizes){
            if(wh[0]<wh[1]){
                wh_max = Math.max(wh_max, wh[1]);
                wh_min = Math.max(wh_min,wh[0]);
                continue;
            }
            wh_max = Math.max(wh_max, wh[0]);
            wh_min = Math.max(wh_min,wh[1]);
        }
        return wh_max * wh_min;
    }
}

 

간단히 설명하면 해당 문제의 요지는 결국 가로 세로 크기를 비교해서

 

큰 녀석들 중에서의 최대값과 작은 녀석들 중의 최대값을 곱한다.

 

뭐 이런 표현이 맞을지는 모르겠다만 해당 코드를 설명하면

 

  • wh_max와 wh_min이라는 int 변수 2개를 생성
  • 반복문을 통해 각 명함들의 가로 세로 크기 비교
  • 둘 중 큰 녀석은 wh_max에 작은 녀석은 wh_min에 담아준다.
    • 단, 전에 저장한 값과 비교한다. 이때에  Math.max 라는 구문을 사용한다.
    •  Math.max  는 2개의 숫자를 비교해서 큰 값을 출력한다
  • 최종적으로 wh_max와 wh_min의 값을 곱하여 return 한다.

 

 


 

무튼 이런식으로 해보았다.

 

최대한 언젠가 보게 될 코딩 테스트를 상정하고.. 30분이면 넉넉하다해서 시간을 쟀지만...

결국 좋은 수를 생각하지 못하니 저렇게 복잡하게 풀었나 싶기도 하다..

 

다음에는 람다 표현식을 좀 익혀서 해볼까 한다.

 

다른 사람 풀이 쭉 보니까 reduce랑 람다 표현식으로 풀었더라....

한번 공부해서 해보자

반응형

댓글