[Javascript] 프로그래머스 level2 - 카펫

ckxo·2022년 11월 1일
0

programmers

목록 보기
14/29

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

코드

function solution(brown, yellow) {
    var answer = [];
    
    brown-=4;
    brown/=2;
    
    for(let i=1; i<=brown; i++){
        for(let j=1; j<=brown; j++){
            if(i+j==brown && i*j==yellow && i>=j){
                answer=[i+2, j+2];
            }
        }
    }
    
    return answer;
}

풀이

yellow의 개수는 brown이 정한다.

카페트의 양끝 모서리 네 부분을 빼야 하기 때문에,
brown-=4를 먼저 해준다.
그리고 yellow의 가로와 세로를 더하면 brown/2이기 때문에,
brown/=2를 해준다.

이후 이중for문을 돌린다.
i와 j의 합이 brown과 같고, i와 j의 곱이 yellow와 같으면,
answer=[i+2, j+2]를 출력해준다.

i와 j에 각각 2를 더하는 이유는 처음에 각 모서리 네 부분을 빼줬기 때문에 가로+2, 세로+2를 해주는 것이다.

ex)

brown=24, yellow=24, result=[8, 6]

brown-=4; //brown=20
brown/=2; //brown=10

이중 for문
( i+j=10(brown) && i*j=24(yellow) )이면 answer.

이때, 가로가 세로보다 길어야 한다고 했으므로, i>=j도 추가해주었다.

[1, 9] // 1+9==brown, 19!=yellow
[2, 8] // 2+8==brown, 2
8!=yellow
[3, 7] // 3+7==brown, 37!=yellow
[4, 6] // 4+6==brown, 4
6==yellow, !(i>=j)
[5, 5] // 5+5==brown, 55!=yellow
[6, 4] // 6+4==brown, 6
4==yellow, i>=j

i=6, j=4
answer=[6+2, 4+2] //[8, 6]

0개의 댓글