Algorithm/CodingTest

[Programmers] Level.1 최소 직사각형(Java)

누구세연 2023. 10. 22. 00:22

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

 

프로그래머스

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

programmers.co.kr

 

최소 직사각형 이라는 문제 Java로 풀이하겠습니다.

문제 설명 및 제한 사항

 

주어진 명함의 가로 길이와 세로 길이를 기반으로 가장 작은 지갑의 크기를 계산하는 문제입니다.

 

다음과 같이 문제 풀이하였습니다.

import java.util.Queue;
import java.util.PriorityQueue;
class Solution {
    public int solution(int[][] sizes) {
        Queue<Integer> width = new PriorityQueue<>((o1,o2)->{
        	return o2 - o1;
        });
        
        Queue<Integer> height = new PriorityQueue<>((o1,o2)->{
        	return o2 - o1;
        });
        

      for(int i=0; i<sizes.length; i++) {
        	int num1 = sizes[i][0];
        	int num2 = sizes[i][1];
        	if(num1<num2) {
        		width.add(num2);
        		height.add(num1);
        	}else {
        		width.add(num1);
        		height.add(num2);
        	}
        }

        return width.peek()*height.peek();
    }
}

저는 Queue라는 자료구조를 사용하여 문제를 풀이하였습니다.
PriorityQueue는 기본적으로 오름차순으로 요소를 정렬합니다. 그러나 람다식을 사용하여 정렬 방법을 설정할 수도 있습니다.

  •  o1 - o2 를 반환하면 o1이  o2 보다 큰 경우에는 양수가 반환되어 내림차순으로 정렬
  • o2 - o1 을 반환하면 o1이 o2 보다 큰 경우에는 음수가 반환되어 오름차순으로 정렬

따라서 위에서 제가 작성한 코드에서는 내림차순으로 요소를 정렬하도록 설정되어있습니다.

 

  1. width 와 height라는 각각의 우선순위 큐를 사용하여 가로와 세로 길이를 저장할 수 있는 변수를 선언합니다.
  2. 입력된 sizes를 순회하면서 사각형의 두변중 긴 변을 width에 작은 변을 height에 넣습니다.
  3. 이후 두 우선 순위 큐의 가장 위의 원소를 peek()을 사용하여 꺼내와서 서로 곱하여 지갑의 최소 크기를 구합니다.

 

다른 이견이 있다면 댓글로 자유롭게 남겨주세요.