개발하는 고양이 오이

13. [JAVA] 프로그래머스 코딩테스트 연습 Level.1 - 최소직사각형° 본문

코딩테스트 - JAVA/프로그래머스 Programmers

13. [JAVA] 프로그래머스 코딩테스트 연습 Level.1 - 최소직사각형°

Cucum 2022. 4. 28. 15:32

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

프로그래머스 코딩테스트 연습 Level.1 - 최소직사각형

 



풀이

import java.util.*;

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
     
        int maxW = 0;
        int maxH = 0;
        
        for (int i = 0; i < sizes.length; i++) {
            int temp = 0;
            
            // 가로 길이보다 세로 길이가 더 길다면 변경
            if (sizes[i][0] < sizes[i][1]) {
                temp = sizes[i][0];
                sizes[i][0] = sizes[i][1];
                sizes[i][1] = temp;
            }
            
            // 가로 길이가 가장 긴 것
            if (maxW < sizes[i][0]) { 
                maxW = sizes[i][0];                
            }
            
            // 세로 길이가 가장 긴 것
            if (maxH < sizes[i][1]) {   
                maxH = sizes[i][1];                                
            }
        }
        answer = maxW * maxH;
        return answer;
    }
}

 


(풀이 실패 과정)

 

저는 이 문제를 처음에 단순하게 생각하지 못하고, 엄청 복잡하게 생각했습니다..

import java.util.*;

class Solution {		// 틀린 코드
    public int solution(int[][] sizes) {
        int answer = 0;
     
        int maxW = sizes[0][0];
        int maxH = sizes[0][1];
        int maxW_H = sizes[0][0];
        int maxH_W = sizes[0][1];
        
        int checkW = 0;
        int checkH = 0;
        
        for (int i = 0; i < sizes.length; i++) {
            if (maxW < sizes[i][0]) {       // 가로 중 가장 큰 수
                maxW = sizes[i][0];                 // 80
                checkW = i;                         // 3
            }
            if (maxH < sizes[i][1]) {       // 세로 중 가장 큰 수
                maxH = sizes[i][1];                 // 70
                checkH = i;                         // 1
            }
            
            maxW_H = sizes[checkW][1];      // sizes[3][1] = 40
            maxH_W = sizes[checkH][0];      // sizes[1][0] = 30 
        }
    
        // 세로 중 가장 큰 수의 가로세로 변경
        sizes[checkH][0] = maxH;      // 30 -> 70
        sizes[checkH][1] = maxH_W;      // 70 -> 30
         
        System.out.println(Arrays.deepToString(sizes)); 
 
        int reMaxW = sizes[0][0];
        int reMaxH = sizes[0][1];
        int reCheckW = 0;
        int reCheckH = 0;
        
        // 70 < 80
        if (maxH < maxW) {      // 기존 세로 최대값(maxH)이 기존 가로 최대값(maxW)보다 작은지     
            for (int i = 0; i < sizes.length; i++) { 
                if (reMaxH < sizes[i][1]) {       // 세로 중 가장 큰 수 다시 확인
                    reMaxH = sizes[i][1];         // 50         
                    reCheckH = i;                 // 0        
                }
            }
            System.out.println(reMaxH);
            System.out.println(reCheckH);
        }
        
        answer = maxW * reMaxH;

        return answer;
    }
}

 

가로들 중 가장 큰수를 찾고, 세로들 중 가장 큰 수를 찾은 후에, 숫자를 뒤집어서 비교하는 그런 복잡한 방법으로 2시간 가량 고생했습니다...

이 풀이는 답이 틀렸을뿐더러 100% 산으로 가고있는거같아서 검색을 통해 힌트를 보고서 알았습니다ㅜㅜ

 

가로:  두 변중에서 긴 부분

세로:  두 변중에서 작은 부분

 

가로를 두 변 중에서 가장 긴 부분으로 설정하고, 세로를 두 변 중에서 가장 짧은 부분으로 설정한 후에 비교하면 끝나는 문제였습니다.

 

즉, 공식적인 순서는

① 가로 세로 길이를 비교 한 후 가로 길이보다 세로 길이가 더 길다면 서로 변경

② 가로 길이 중 가장 긴 값 선택

③ 세로 길이 중 가장 긴 값 선택

④ 선택된 두 값을 곱한 후 return

 

저처럼 복잡하게 생각하면 끝도없이 길어질 코드고, 단순하게 생각하면 제가 해결한 코드보다도 더 짧아질 수 있는 코드입니다.

 

감사합니다.