개발새발 로그

[JS] 프로그래머스 : 카펫 본문

알고리즘

[JS] 프로그래머스 : 카펫

이즈흐 2023. 6. 12. 21:19

카펫

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

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

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

제한사항

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

입출력 예

brown yellow return

10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

출처

※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.

 

 

풀이방법

1. yellow를 기준으로 yellow갯수로 만들수 있는 tempX와 tempY의 경우의 수 중 가능한 경우를 탐색해야한다. 

2. 임의의 tempX와 tempY를 곱했을 때 yellow가 나올 수 있는 수를 구하고

3. 그 값들 중 모서리갯수 +2한 값으로 곱해서 yellow카펫을 뺐을 때 borwn수가 나오면 그 경우의 수가 정답이다.

    a * b - brown = yellow
    a * b = brown + yellow

내 풀이

function solution(brown, yellow) {
    var x=0,y=0;
    var tempX=0,tempY=0;
    for(var i=1;i<=yellow;i++){//노란색을 기준으로  가로와 세로를 구한다.
        if(yellow % i === 0){//yello값에 나눠지는 값은 세로값으로 가능한 길이이다. 24일 경우 2x12 , 3x8 , 4x6...
            tempX=yellow/i; //1에서 걸러져도 아래에서 안맞으면 안됨, 만약x가 24면 y는 1임
            tempY=i;
            if((tempX+2)*(tempY+2)-yellow == brown){// (tempX+2)*(tempY+2)-yellow 카펫 전체 넓이에서 옐로우를 뺏을때 brown가 같으면 맞는 카페트
                x = tempX+2;
                y = tempY+2;
                break;
            }
        }

    }
    return [x,y];
}

다른 풀이

1.카페트의 전체크기를 3부터 나누기 시작한다(최소크기가 3x3이다. 조건에서 갈색은 8개, 노란색은1개로 최소값을 줬다).

2. i로 전체크기를 나눈 값을 x로 정하고 y는 i로 정한다.

3. yellow의 크기는 각각 모서리 갯수를 빼서 곱한 값과 같다면 현재 x와y값이 정답이다.

function solution(brown, red) {
    var answer = [];
    for (var i = 3; i <= (brown+red)/i; i++) {
        var x = Math.floor((brown+red)/i);
        if( (x-2)*(i-2)=== red) {
            break;
        }
    }

    return [x,i];
}

 

728x90
반응형
LIST