프로그래머스

[JavaScript] 최소직사각형 - 프로그래머스

jjangsh 2024. 8. 27. 11:12

문제 :

 

 

내 풀이 :

function solution(sizes) {
  let maxW = 0;
  let maxH = 0;

  for (let i = 0; i < sizes.length; i++) {
    if (sizes[i][0] > sizes[i][1]) {
      if (maxW < sizes[i][0]) {
        maxW = sizes[i][0];
      }
      if (maxH < sizes[i][1]) {
        maxH = sizes[i][1];
      }
    } else {
      if (maxW < sizes[i][1]) {
        maxW = sizes[i][1];
      }
      if (maxH < sizes[i][0]) {
        maxH = sizes[i][0];
      }
    }
  }
  return maxW * maxH;
}

 

1.  반복문을 통해 모든 명함 크기를 하나씩 검사한다.

 

2.  각 명함에 대해, 가로(sizes[i][0])와 세로(sizes[i][1]) 중 더 큰 값을 가로(maxW에 대응)로 설정하고, 더 작은 값을 세로(maxH에 대응)로 설정한다.

 

3. 반복문이 끝난 후 maxW에는 지갑의 가로 길이로 필요한 최댓값이, maxH에는 지갑의 세로 길이로 필요한 최댓값이 들어 있다.

 

4. 최종적으로 maxW와 maxH를 곱하여 지갑의 최소 면적을 계산하여 반환한다.

 

예시

예를 들어, sizes = [[60, 50], [30, 70], [60, 30], [80, 40]]가 주어진 경우:

  • 첫 번째 명함: 60x50 → 가로 60, 세로 50으로 처리
  • 두 번째 명함: 30x70 → 가로 70, 세로 30으로 처리
  • 세 번째 명함: 60x30 → 가로 60, 세로 30으로 처리
  • 네 번째 명함: 80x40 → 가로 80, 세로 40으로 처리

최종적으로 지갑의 최소 크기는 80 (가로) * 50 (세로) = 4000이 된다.

 

 

📌 코드가 너무 지저분하고 if문을 중첩해서 사용하니 가독성이 떨어져서 리팩토링 해보았다.

 

 

리팩토링 코드 :

function solution(sizes) {
    let maxW = 0;
    let maxH = 0;
    
    sizes.forEach((size) => {
        const [w, h] = size[0] > size[1] ? [size[0],size[1]] : [size[1],size[0]];
        maxW = maxW < w ? w : maxW;
        maxH = maxH < h ? h : maxH;
    })
    return maxW * maxH;
}

 

처음 작성했던 코드와 기능은 같지만 훨씬 깔끔해진 모습이다.

 

반복문은 forEach를 사용하여 명함 하나하나씩을 검사하고, 구조분해할당과 삼항연산자를 사용하여 가독성은 높이고 코드의 길이도 짧아졌다.