프로그래머스 카펫

hwakyoung·2024년 2월 12일
0

코딩 테스트

목록 보기
5/6
post-thumbnail

⚠️ 문제

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

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

⚠️ 입출력 예시

이렇게 나오게 하는 문제이다.


간단하게 brown 과 yellow를 더해서 그 값의 약수를 찾고 그 안에서 해결하면 되겠다가 1차 생각.

그리고 가로 세로가 무조건 3은 넘는다는 사실을 깨달았다.

그럼 반복문을 돌릴때 i가 3부터 시작하면 되겠구나!! 2차 생각

그렇게 첫번째 코드 작성

function solution(brown, yellow) {
    var answer = [];
    var res = brown + yellow;
    for(let i=3; i<= brown; i++){
        if(res % i == 0){
            let weight = res/i;
             if(i >= weight && weight >=3){
                return [i, weight];
             }
        }
    }
    return answer;
}

이렇게 작성했다... 하지만 테스트케이스에서 차단당함..

왜 뭐가 문제일까 생각을 했는데 18, 6 [8,3]으로 테스트를 다시 해본 결과 이 숫자는 되지 않았다.

여기서 i는 [4,6,8,12,24]이고 weight는 [6,4,3,2,1]이다
내가 작성한 if문을 통해 하나씩 걸러내보면 [6,4]와 [8,3] 2개가 남게 된다. 결론적으로 이 2가지 경우 모두 다 해당되게 된다는 것이다.ㅠㅠ


그럼 어떻게 해결할까.. 생각하다가 yellow를 이용해보자~~!!

그래서 (i-2)*(weight-2) === yellow)이런식으로 했는데 되었다ㅠㅠㅠㅠㅠ

function solution(brown, yellow) {
    var answer = [];
    var res = brown + yellow;
    for(let i=3; i<= brown; i++){
        if(res % i == 0){
            let weight = res/i;
             if((i-2) * (weight -2) === yellow){
                return [weight, i];
             }
        }
    }
    return answer;
}

10 , 2 [4,3] 이라는 테스트케이스로 설명을 해보자면

여기서 i[3,4,6] , weight[4,3,2]가 된다.
이 친구들을 짝지어 본다면 [3,4] , [4,3] , [6,2] 이렇게 3가지로 나뉘게 된다.
그럼 i와 weight에서 각각 2를 빼보자! 그렇게 돼서 yellow와 수가 같아지는 것은
[4,3] 이므로 정답이 4,3이 되는 것이다..

profile
fire-irror

0개의 댓글

관련 채용 정보