[JavaScript][Programmers] 카펫

조준형·2021년 7월 3일
0

Algorithm

목록 보기
11/142
post-thumbnail

🔎 카펫

❓ 문제링크

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

📄 제출 코드

// brown = yellowW*2 + yelloH*2 + 4
function solution(brown, yellow) {
    for (var i = 1; i <= yellow; i++) {
        let yellowW = i;
        let yellowH = yellow / i;

        var answer = [];
        let width, height = 0;
        if (brown == yellowW * 2 + yellowH * 2 + 4) {
            
            yellowW > yellowH ? width = yellowW : width = yellowH;
            yellowW > yellowH ? height = yellowH : height = yellowW;
            
            answer = [width + 2, height + 2];
            break;
        }

    }
    return answer;
}

이 문제를 풀 때 위의 반복문보다는 for안의 if문을 먼저 생각했다.

if(brown == yellowW * 2 + yellowH * 2 + 4)

처음엔 map을 만들어 보면서 확인을 다해봐야되나 했는데 생각하다보니 규칙(?)이 보였다.

모든 경우를 생각해 보면서 조건에 맞는경우, width +2, height+2를 출력한다.
두 값에 +2 는 모서리부분을 추가한 것이다.

🎲 풀이 과정

📄 초기 코드

// brown = yellowW*2 + yelloH*2 + 4
function solution(brown, yellow) {
    for (var i = 1; i <= yellow; i++) {
        let yellowW = 0;
        let yellowH = 0;
        yellowW = i;
        yellow % 2 != 0 ? yellowH = 1 : yellowH = yellow / i;

        var answer = [];
        if (brown == yellowW * 2 + yellowH * 2 + 4) {
            answer = [yellowH+2, yellowW+2];
          break;
        }
    }
    return answer;
}

👉 1. 생각한대로

먼저 생각난대로 작성해보았다.
이 경우 내가 홀 수 경우 높이를 무조건 1로 나온다고 생각해서 홀수의 경우 높이를 1로 두고, 아닌경우 yellow/i를 하였다.
그리고 결과 값이 높이와 넓이가 반대로 나왔는데 일단 바꿔서 진행하였다.

👉 2. yellowH

일단 3개 테스트케이스가 틀렸다고 하여 뭐가 문젤까 생각하다가, yellowH가 문제였다.
만약 yellow가 9인경우 3x3할 수도 있으니 1로 고정하면 안됐다.
그래서 yellowH를 yellow가 홀수든 짝수든 yellow/i로 나누었다.
어차피 i가 1부터 다돌기때문에 모든 경우를 생각한다.

👉 3. width,height

function solution(brown, yellow) {
    for (var i = 1; i <= yellow; i++) {
        let yellowW = i;
        let yellowH = yellow / i;

        var answer = [];
        if (brown == yellowW * 2 + yellowH * 2 + 4) {
            answer = [yellowH + 2, yellowW + 2];
            break;
        }
    }
    return answer;
}

해당코드로 통과는 했지만, 왜 반대로 나오는지 알아야 했기 때문에 생각을 해봤다.
그 결과, 일단 3x4나 4x3이나 같은 카펫이다.
나는 반복문을 1부터 증가하는 형태로 돌았기 때문에 넓이가 짧은게 먼저 나오게 된다.

문제에 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다. 라는 구문이 있다.
그래서 for문을 반대로 돌리거나, yellowW와 yellowH를 비교해서 windth, height를 새로 지정해주거나 해야했다.
나는 삼항연산자를 연습하기위해 후자를 택했다.

yellowW > yellowH ? width = yellowW : width = yellowH;
yellowW > yellowH ? height = yellowH : height = yellowW;

나는 연습하려고 삼항연산자를 썻지만, 사실 Math.max(), min()으로 구해도 됨.

width = Math.max(yellowW, yellowH);
height = Math.min(yellowW, yellowH);

+ 추가

yellowW > yellowH ? [width, height] = [yellowW, yellowH] :[width, height] = [yellowH, yellowW]

구조분해할당을 이용해 한 문장으로 쓸 수도 있다.

profile
깃허브 : github.com/JuneHyung

0개의 댓글