알고리즘
프로그래머스 - 최소직사각형
Heidong
2022. 6. 30. 15:18
반응형
내 풀이
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class P_33 {
public int solution(int[][] sizes) {
// 최소직사각형
int a = 0; // 가로
int b = 0; // 세로
List<Integer> width = new ArrayList<>();
List<Integer> height = new ArrayList<>();
for(int i=0; i<sizes.length; i++) {
for(int j=0; j<sizes[i].length; j++) {
if(sizes[i][j] >= sizes[i][j+1]) {
width.add(sizes[i][j]);
height.add(sizes[i][j+1]);
} else {
width.add(sizes[i][j+1]);
height.add(sizes[i][j]);
}
j++; // 다음 방으로
}
}
a = Collections.max(width);
b = Collections.max(height);
return a * b;
}
public static void main(String[] args) {
P_33 p = new P_33();
int[][] sizes = {{60,50}, {30,70}, {60,30}, {80,40}};
p.solution(sizes);
System.out.println(p.solution(sizes));
}
}
문제의 가장 큰 요지는 가로 세로를 바꿨을때 더 최적의 가로 세로 길이가 있냐는 것인데
이걸 단순하게 생각한다면 2차원 배열에서 각 원소에 있는 원소 배열속의 원소 2개의 수 중에서 가장 큰 수를 한쪽 리스트에 담고(가로라고 침) 나머지 작은 수들을 모아서 (세로라고 침) 분리를 해놓고
그 분리해논 값들 중에서 가장 큰 값을 각각 뽑아내면 문제가 요구하는 답을 찾을 수 있다.
다른 사람 풀이
class Solution {
public int solution(int[][] sizes) {
int max = 0;
int min = 0;
for (int[] size : sizes) {
int paramMax = Math.max(size[0], size[1]);
int paramMin = Math.min(size[0], size[1]);
if (paramMax > max) {
max = paramMax;
}
if (paramMin > min) {
min = paramMin;
}
}
return max * min;
}
}
2차원 배열의 향상된 for문 사용법 : 배열 하나를 선언해서 돌린다.
Math의 max(), min() 메소드를 이용해서 쉽게 구할 수 있다.
중요한 점은 2차원 배열 속 1차원 배열들의 원소니까 2차원 배열 크기만큼 반복문을 돌리고 1차원 배열 원소값들의 max값, min값을 구해서 계산하면 됨.
import java.util.*;
class Solution {
public int solution(int[][] sizes) {
return Arrays.stream(sizes).reduce((a, b) -> new int[]{
Math.max(Math.max(a[0], a[1]), Math.max(b[0], b[1])), Math.max(Math.min(a[0], a[1]), Math.min(b[0], b[1]))
}).map(it -> it[0] * it[1]).get();
}
}
람다를 이용해서 풀이.
마찬가지로 2차원 배열 sizes를 반복문으로 돌림.
stream의 reduce() 메소드 : 스트림의 원소들을 하나씩 소모해가면서 누적 계산을 수행하고 최종적으로 결과 값을 리턴 해줌.
stream의 map() 메소드 : 스트림에서 특정 연산한 결과 전체를 반환 해줌.
반응형