Programmers : https://programmers.co.kr/learn/courses/30/lessons/42842
코딩테스트 연습 - 카펫
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 ��
programmers.co.kr
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만,
전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때
카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
programmers level2 카펫 문제입니다.
아주아주 단순한 문제입니다(?)
주어진 갈색 카펫의 수와, 노란 카펫의 수로 전체 카펫의 가로, 세로 크기를 알아내는 문제입니다
* 노란 카펫은 반드시 직사각형이 되어야 한다는 것. 이것만 아신다면 문제를 해결할 수 있을거라고 생각합니다.
주어진 노란카펫의 가로, 세로 높이를 임의의 수로 초기화 한 후에,
현재 가로, 세로 높이가 노란카펫을 직사각형으로 만들 수 있는지 없는지 확인해주시면서
갈색 카펫의 수를 예측해주시면 끝입니다.
저같은 경우 노란카펫의 높이를 1로 시작해서 찾아갔습니다.
간단한 규칙이 있다면 이정도겠네요
갈색카펫의 높이 중에서 위아래를 제외한 크기 = 세로카펫 높이*2
갈색카펫의 너비 = 세로카펫 너비 * 2 + 4
좀 더 자세한 설명은 주석을 적어놓았습니다~
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int brown, int yellow) {
vector<int> answer;
// 카펫은 직사각형이라는 특징이 있으므로
// 노란 카펫을 직사각형으로 만들어가면서, 갈색 카펫을 고려
// => 노란 카펫의 높이가 1일때부터 고려해주면 된다
int h = 1;
int w = yellow;
while(1){
int bh, bw;
// 갈색 카펫의 양쪽 높이의 위,아래 부분을 제외한 갯수는
// 노란 카펫의 높이 * 2
bh = h*2;
// 갈색 카펫의 위아래 가로부분의 갯수는
// 노란 카펫의 너비 * 2 + 4
bw = w*2 + 4;
if(bh + bw == brown){
answer.push_back(bw/2);
answer.push_back(bh/2+2);
break;
}
else{
// 노란 카펫의 갯수를 직사각형의 갯수에 맞게 조절해준다
int check_h = h;
int check_w = w;
for(int i = 1; ; i++){
if((check_h+i) * (yellow/(check_h+i)) == yellow){
h = check_h+i;
w = yellow/(check_h+i);
break;
}
}
}
}
return answer;
}
'algorithm > programmers' 카테고리의 다른 글
Programmers 블록 이동하기 (0) | 2020.12.08 |
---|---|
Programmers 디스크 컨트롤러 C++ (0) | 2020.08.20 |
Programmers 숫자 야구 C++ (0) | 2020.07.03 |
Programmers 소수 찾기 C++ (0) | 2020.07.03 |
Programmers 라면공장(C++) (0) | 2020.07.02 |