본문 바로가기
코딩 문제/프로그래머스 [ JavaScript ]

[ 프로그래머스 / JavaScript ] 카펫

by CODESIGN 2022. 9. 30.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

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]

 


나의 문제 풀이

입출력 예에서

brwon = 24이고 yellow=24일 때,

yellow카펫의 가로와 세로의 길이를 구해 주어진 brown카펫의 수로 yellow카펫을 다 감쌀 수 있어야 한다.

 

yellow의 가로*세로 길이가 여러 경우의 수일 수 있다:

24 x 1

12 x 2

8 x 3

6 x 4

 

이때 brown은 24이므로 주어진 사진처럼 노란색 카펫을 다 감쌀 수 있어야 한다.

그래서 while loop을 돌려 주어진 brown의 개수와 노란색의 여러 경우의 수들을 개산해 같은 brown카펫의 수가 나올 때 

가로와 세로의 길이를 return 해주었다. 

 

return 할 때 +2를 한 이유는 x와 y는 현재 노란색 카펫의 길이이므로 갈색 카펫의 길이를 구하기 위해 더해주었다.

 

function solution(brown, yellow) {
    let tmpBrown = 0;
    let x = 0; 
    let y = 1;
    while (brown != tmpBrown) {
        if (yellow % y == 0) {
            x = yellow/y; //가로x세로값이 yellow와 같을때;
            tmpBrown = (x * 2) + (y * 2) + 4;
            if (tmpBrown == brown) { //갈색 카펫(tmpBrown)이 brown의 개수와 같을때
                break; // while loop을 끝내준다.
            }
        }
        y++;
    }
    return [Math.max(x+2, y+2), Math.min(x+2, y+2)];
}

 

 


다른 풀이

 

runtime은 대체적으로 비슷하며 내 코드가 조금 더 빠르다.

하지만 이 코드는 훨씬 간결하다. 

 

for loop에서 i는 3에서 시작한다. 그 이유는 yello 카펫은 1이상, brown은 8이상이라고 제한 조건에 맞게

yellow가 가장 작은 길이 1일때 brown은 8이어야하고 이때 가로와 세로의 최소길이는 3이기 때문이다. 

 

앞에서 짚은 것과 같이 노란색의 경우 여러 경우의 수가 있는데 나는 모든 수를 확인을 했다면

여기서는 i <= (brown+red)/i;  와 Math.floor()을 사용하여 노란색 카펫의 가로와 세로의 길이를 구했다.

 

마지막에 reuturn에서는 [i, x]가 아닌 [x, i]를 해주는 이유는

이 문제에서 제한 사항 중 하나가 가로의 길이가 세로의 길이보다 같거나 커야한다.

i는 3에서 시작해 점점 커진다. 그러므로 전체길이에서 i를 나누었을때 x는 i보다 크거나 같을 수 밖에 없다.

 

 

function solution(brown, red) {
    for (var i = 3; i <= (brown+red)/i; i++) { //가능한 세로의 길이를 모두 둘러본다
        var x = Math.floor((brown+red)/i); // 현제 새로의길이 값
        if( (x-2)*(i-2)=== red) { // brown의 카펫값들을 -2로 빼준뒤 나온값이 red와 같을 때
            break; // for loop을 끝낸다
        }
    }

    return [x,i];
}

 

 

댓글