📊 Algorithm&SQL
[Java/프로그래머스] 최소직사각형
오늘 ONEUL
2022. 11. 19. 19:00
문제
풀이
(1) 문제 분석하기
- 문제에 현혹되지 말자. 결국 긴 변 중에 가장 긴 변과 짧은 변 중에 가장 긴 별을 곱하면 된다.
- for문과 if문을 중첩으로 사용했더니 바로 시간초과가 나버렸다...!
- 배열의 정렬을 이용해보자.
- 최대수, 최소수를 구해주는 Math.max, Math.min을 이용해보자.
(2) 슈도코드 작성하기
// 첫번째 풀이
각 변을 담을 int 변수 biggerSideMax, smallerSideMax 선언
for(sizes의 길이만큼) {
if(첫번째 요소가 두번째 요소보다 클 때) {
if(긴 변의 요소가 biggerSideMax 보다 클 때 {
biggerSideMax에 긴 변 요소 담기
}
if(짧은 변의 요소가 smallerSideMax보다 클 때) {
smallerSideMax에 짧은 변 요소 담기
}
} else {
긴 변과 짧은 변의 순서 바꿔주기
i--
}
}
biggerSideMax * smallerSideMax
// 두번째 풀이
긴 변이 담길 배열과 짧은 변이 담길 배열 선언
for(sizes의 길이만큼) {
if(첫번째 요소가 두번째 요소보다 클 때) {
첫번째 요소를 긴 변 배열에 담기
두번째 요소를 짧은 변 배열에 담기
} else {
두번째 요소를 긴 변 배열에 담기
첫번째 요소를 짧은 변 배열에 담기
}
}
두 배열 모두 오름차순으로 정렬
각 배열의 마지막 요소만 출력
biggerSideMax * smallerSideMax
// 세번째 풀이
각 변을 담을 int 변수 biggerSideMax, smallerSideMax 선언
for(sizes의 길이만큼) {
Math.max 메소드를 이용하여 긴 변을 구하고,
Math.min 메소드를 이용하여 짧은 변을 구하기
}
biggerSideMax * smallerSideMax
(3) 코드 구현하기
시간초과 났던 첫번째 풀이
package algorithm.test14;
public class Solution {
public static void main(String[] args) {
int[][] arr = {{60, 50}, {30, 70}, {60, 30}, {80, 40}};
System.out.println(solution(arr));
}
public static int solution(int[][] sizes) {
// 긴 변중에 가장 긴 변
// 짧은 변 중에 가장 긴 변
// 첫번재 풀이
int biggerSideMax = 0;
int smallerSideMax = 0;
for (int i = 0; i < sizes.length; i++) {
if (sizes[i][0] > sizes[i][1]) {
if (biggerSideMax < sizes[i][0]) {
biggerSideMax = sizes[i][0];
}
if (smallerSideMax < sizes[i][1]) {
smallerSideMax = sizes[i][1];
}
} else {
int temp = sizes[i][0];
sizes[i][0] = sizes[i][1];
sizes[i][1] = temp;
i--;
}
}
return biggerSideMax * smallerSideMax;
}
}
배열의 정렬을 이용한 두번째 풀이
package algorithm.test14;
import java.util.Arrays;
public class Solution {
public static void main(String[] args) {
int[][] arr = {{60, 50}, {30, 70}, {60, 30}, {80, 40}};
System.out.println(solution(arr));
}
public static int solution(int[][] sizes) {
// 긴 변중에 가장 긴 변
// 짧은 변 중에 가장 긴 변
// 두번째 풀이
int[] firstArr = new int[sizes.length];
int[] secondArr = new int[sizes.length];
for (int i = 0; i < sizes.length; i++) {
if (sizes[i][0] > sizes[i][1]) {
firstArr[i] += sizes[i][0];
secondArr[i] += sizes[i][1];
} else {
firstArr[i] += sizes[i][1];
secondArr[i] += sizes[i][0];
}
}
Arrays.sort(firstArr);
Arrays.sort(secondArr);
int biggerSideMax = firstArr[sizes.length - 1];
int smallerSideMax = secondArr[sizes.length - 1];
return biggerSideMax * smallerSideMax;
}
}
Math.max, Math.min을 이용한 세번째 풀이
package algorithm.test14;
public class Solution {
public static void main(String[] args) {
int[][] arr = {{60, 50}, {30, 70}, {60, 30}, {80, 40}};
System.out.println(solution(arr));
}
public static int solution(int[][] sizes) {
// 긴 변중에 가장 긴 변
// 짧은 변 중에 가장 긴 변
// 세번째 풀이
int biggerSideMax = 0, smallerSideMax = 0;
for (int[] size : sizes) {
biggerSideMax = Math.max(biggerSideMax, Math.max(size[0], size[1]));
smallerSideMax = Math.max(smallerSideMax, Math.min(size[0], size[1]));
}
return biggerSideMax * smallerSideMax;
}
}
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr