프로그래머스 - 카펫(c++, javascript)
IT/알고리즘

프로그래머스 - 카펫(c++, javascript)

반응형

문제 설명

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

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

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

 

제한사항

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

 

입출력 예

풀이

이 문제는 굉장히 쉽게 풀었다.

가로, 세로 길이를 각각 r, c라고 했을 때


(r+c-2)*2 = brown   --> 1번 식 (가로, 세로 각각 1개씩 중복되므로 2를 빼주고 가로세로를 곱하면 brown 개수가 된다.)

r*c-brown = yellow  --> 2번 식 (yellow 개수는 전체 격자 개수에서 brown의 개수를 뺀 나머지이다.)

 

이렇게 2가지의 식을 아래처럼 정리하면

 

1번 식 정리

r+c-2 = brown/2
r+c = brown/2 +2

 

2번 식 정리

r*c-brown = yellow
r*c = yellow + brown

 

따라서, r과 c에 관해 2가지 식을 얻을 수 있다.

r+c = brown/2 +2

r*c = yellow + brown

 

#include <string>
#include <vector>
using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    
    int rc_sum = brown/2 +2;
    int rc_mul = brown + yellow;
    
    for(int r = rc_mul/2; r>=3; --r){
        int c = rc_mul/r;
        if(rc_mul%r == 0 && r+c == rc_sum) {
            answer.push_back(r);
            answer.push_back(c);
            break;
        }
    }
        
    return answer;
}

 

javascript

function solution(brown, yellow) {
    const answer = [];
 
    const rc_sum = Math.floor(brown/2) +2;
    const rc_mul = brown + yellow;
    
    for(let r = Math.floor(rc_mul/2); r>=3; --r){
        const c = Math.floor(rc_mul/r);
        if( rc_mul%r == 0 && r+c == rc_sum) {
            answer[0] = r;
            answer[1] = c;
            break;
        }
    }

    return answer;
}
반응형