<프로그래머스, 최소직사각형 넓이 구하기>

Minwoong Kim·2022년 9월 9일
0

2022-Sep-07, today getting out of my comfort zone.

문제 설명

명함 지갑을 만드는 회사에서 다양한 크기의 명함을 수납할 수 있는 가장 작은 크기의 지갑을 만드려고 한다. 명함들의 가로와 세로 길이를 나타내는 이중 배열 sizes가 주어질 때, 모든 명함의 가로 길이와 세로 길이를 허용하는 지갑의 최소 크기를 구하는 함수를 작성해라.

단,

  1. 명함을 돌려서 가로와 세로 길이를 서로 바꿀 수 있으며
  2. 지갑의 크기는 가로 * 세로로 정의된다.
  3. 명함의 크기 배열은 [w, h] 의 이중 배열로 주어지며,
  4. w 는 가로 h는 세로를 나타낸다. 또한 w와 h는 1이상 1000이하의 자연수 이다.

예) sizes = [[60, 50], [30, 70], [60, 30], [80, 40]]; result = 4000

Comfort zone

명함들의 크기를 쉽게 비교하기 위해, 가로 길이가 세로 길이보다 큰 상태로 만들었다. 그리고 가로의 최대값과 세로의 최대값을 구하여 곱한 값을 출력하도록 하였다.

이때, 가로 길이를 세로 길이 보다 크게 만드는 아이디어가 이 문제를 해결하는 데 있어서 가장 핵심 아이디어라고 할 수 있다.

Step-1

for(let i=0; i<sizes.length; i++){
    if(sizes[i][0] < sizes[i][1]){
        sizes[i].reverse();
        Garo.push(sizes[i][0]);
        Sero.push(sizes[i][1]);
    } else if(sizes[i][0] >= sizes[i][1]){
        Garo.push(sizes[i][0]);
        Sero.push(sizes[i][1]);
    }
}

명함들의 크기를 비교하기 위해 가로 길이가 세로 길이 보다 길게 만들기 위한 과정이다. for문을 사용하여 배열을 순회하면서 sizes[i][0], i번째 배열 요소의 첫번째 값과 sizes[i][1], i번째 배열 요소의 두번째 값의 크기를 비교하여 세로가 더 크다면([가로, 세로]이므로) reverse()를 이용하여 순서를 바꾸어 주었다.

또한, sizes[i][0]은 새로 만든 Garo 배열에 Push 하고 sizes[i][1]은 새로 만든 Sero 배열에 Push 하여 각각 가로와 세로의 길이를 나타내는 두 가지 배열을 완성한다.


Step-2

var answer = Math.max(...Garo)*Math.max(...Sero);

Step-1에서 완성된 가로와 세로 배열에서 max 값을 추출하여 곱해준 값을 answer에 할당한다.

이때, Math.max()에서 괄호 안에 전개 연산자를 써주지 않으면 NaN이 나옴을 주의하자.

Getting out of comfort zone

map 메서드와 삼항 연산자, 그리고 forEach문으로 위에서 설명한 과정을 동일하게 진행하는 코드를 작성해보았다. map함수는 처음 써봤는데 처음 문제를 접할 때, 아직 나는 for문 부터 생각나는데... forEach, Map, filter, reduce에 대해 전체적으로 한 번 리뷰할 필요가 있을 것 같다. 할 때마다 찾아보게 되네...

또한,구조 분해 할당에 대해 공부를 해봐야할것 같다.

Getting out of comfort zone-2

map함수와 forEach를 각각 썼을 때와 비교해 약 3ms 정도 연산 속도가 감소했다.(성능이 좋아졌다)

두번 째 코드를 작성하고나서, 맨 처음 for문을 썼을 때의 코드와 비교를 해보니 반복 작업을 수행하는 메서드가 2개가 된 것을 확인할 수 있었다.

map 메서드 내에 삼항 연산자로 하여금 다중 연산을 진행할 수 있도록 코드를 작성한 결과, 위와 같은 결과물을 얻을 수 있었다. forEach 문 하나가 Map이나 for문과 비슷한 시간복잡도를 가짐을 생각하면 훨씬 더 좋은 결과물이 된 것이다.

또한, for문은 index를 증가시키며 차례로 진행하는 과정에서 문제가 발생하면 실행이 중단되지만, Map은 일단 끝까지 다 실행한다. 따라서 프로그래밍에서의 안정성은 Map이 더 높다고 볼 수 있다.(속도의 유의미한 차이는 없을 것이다)

느낀 점

공부해야 할 것

  1. 구조 분해 할당
  2. Map, filter, reduce, forEach 정리
profile
Get out of my comfort zone

0개의 댓글