프로그래머스의 최소직사각형을 풀어보았습니다.

 

링크

https://school.programmers.co.kr/learn/courses/30/lessons/86491

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이

모든 명함을 수납할 수 있는 가장 작은 지갑을 만들어야 합니다.
매개변수로 주어진 sizes에서 가로, 세로 각각 최대 값으로 지갑을 만들어야 합니다.
하지만 가로, 세로 값은 변경될 수 있다는 점을 고려해서 만들어야 합니다.
ex. 
A명함: 가로(60), 세로(50)
B명함: 가로(40), 세로(80)

A명함과 B명함의 가로 최대 값(60), 세로 최대 값(80)으로 만들면 
60*80 = 4800
4800이라는 결과 값이 나옵니다.
하지만 B명함의 방향을 눕혀서 가로와 세로 길이를 바꾼다면 달라집니다.
ex. 
A명함: 가로(60), 세로(50)
B명함: 세로(80), 가로(40)

위의 상황이라면 가로 최대 값(80), 세로 최대 값(50)으로
80*50 = 4000
4000이라는 결과 값이 나옵니다.

모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 가장 작게 만들 수 있는 지갑의 크기를 구하면 됩니다.
1. 각 명함의 가로, 세로 길이를 큰 값과 작은 값으로 구분합니다.
2. 저장되어 있는 큰 길이와 현재 명함의 큰 길이 값을 비교하여 현재 명함 길이가 더 크다면 현재 명함의 큰 값으로 바꿔줍니다.
3. 저장되어 있는 작은 길이와 현재 명함의 작은 길이 값을 비교하여 현재 명함 길이가 더 크다면 현재 명함의 작은 값으로 바꿔줍니다.
4. 모든 명함 값을 체크한 후 저장되어 있는 큰 길이와 작은 길이를 곱해서 결과를 반환합니다.

public int solution(int[][] sizes) {
    int max = 0;
    int min = 0;
    for (int[] size : sizes) {
        max = Integer.max(Integer.max(size[0], size[1]), max);
        min = Integer.max(Integer.min(size[0], size[1]), min);
    }
    return max * min;
}

 

후기

* 난이도 (5점 만점)

5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.

4 : 평균적인 기업 코딩 테스트의 중간 이상.

3 : 평균적인 기업 코딩테스트의 쉬운 문제.

2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.

1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.

 

프로그래머스의 최소직사각형 문제는 알고리즘 공부를 하지 않았더라도 어렵지 않습니다.
문제를 이해하고 푼다면 누구나 풀 수 있는 문제라고 생각합니다.

+ Recent posts