최소직사각형

Creating the dots·2021년 10월 2일
0

Algorithm

목록 보기
19/65

프로그래머스

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

나의 풀이

처음에는 복잡하게 생각해서 다음과 같이 코드를 작성했고, 테스트케이스를 거의 통과하지 못했다.

swap을 통해서 결국, 큰 값을 하나의 배열(widths 또는 heights)에 몰아서, widths 배열의 최댓값과 heights 배열의 최댓값의 곱을 리턴시키려고 했던 것이다.

function solution(sizes){
  let widths = [];
  let heights = [];
  let maxWidth = 0;
  let maxHeight = 0;
  
  for(let i=0;i<sizes.length;i++){
    widths.push(sizes[i][0]);
    heights.push(sizes[i][1]);
  }
  
  maxWidth = Math.max(...widths);
  maxHeight = Math.max(...heights);
  
  const swap = (arr1, arr2, maxVal) => {
    const idx = arr1.indexOf(maxVal);
    const temp = arr2[idx];
    arr2[idx] = maxVal;
    arr1[idx] = temp;
    maxWidth = Math.max(...widths);
    maxHeight = Math.max(...heights);
  }
  
  if(maxWidth>=maxHeight){
    swap(widths,heights,maxWidth);
    for(let i=0;i<widths.length;i++){
      if(widths[i]<maxHeight && widths[i]!==maxWidth){
        swap(widths,heights,widths[i])
       }
     }
  }else{
    swap(heights,widths,maxHeight);
    for(let i=0;i<heights.length;i++){
      if(heights[i]<maxWidth && heights[i]!==maxHeight){
        swap(heights,widths,heights[i]);
      }
    }
  }
  return maxWidth * maxHeight;
}
    

다른 사람 풀이 (1)

이 풀이는 큰값을 max 배열에 몰고, 작은 값을 min 배열에 몰아서 각각의 최댓값의 곱을 리턴한다.

나와 같은 의도였지만, 훨씬 간결하고 직관적인 코드로 문제를 해결했다. 가로와 세로 길이에 자꾸 연연했는데, 이 풀이를 보니, 가로, 세로는 중요하지 않고 두 개의 길이 중에서 큰것과 작은 것을 구분하는 것에 초점을 두고 문제를 해결하면 된다는 것을 깨달았다.

function solution(sizes){
  let max = [];
  let min = [];
  for(const el of sizes){
    if(el[0]<el[1]){
      max.push(el[1]);
      min.push(el[0]);
    }else{
      max.push(el[0]);
      min.push(el[1]);
    }
  }
  return Math.max(...long)*Math.max(...short);
}

다른 사람 풀이 (2)

이 풀이도 의도는 같은데, 배열을 쓰지 않고, 변수에 최솟값 0을 할당해놓고, sizes의 요소인 s의 최댓값을 longer에, 최솟값을 shorter에 반복해서 저장, 업데이트한다.

function solution(sizes){
  let longer = 0;
  let shorter = 0;
  sizes.forEach((s) => {
    if(longer < Math.max(...s)) longer = Math.max(...s);
    if(shorter < Math.min(...s)) shorter = Math.min(...s);
  });
  return longer*shorter;
}
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글