반응형
문제 설명
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;
}
반응형
'IT > 알고리즘' 카테고리의 다른 글
프로그래머스 - 가장 큰 정사각형 찾기(c++, javascript) (0) | 2020.10.05 |
---|---|
프로그래머스 - 타겟 넘버(c++, javascript) (0) | 2020.10.01 |
프로그래머스 - 구명보트(c++, javascript) [탐욕법] (0) | 2020.09.29 |
프로그래머스 - 위장(c++, javascript) (0) | 2020.09.28 |
프로그래머스 - H-Index(c++, javascript) (0) | 2020.09.25 |