카펫 : 문제 링크
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했다. Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성.
제한 사항
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수이다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수이다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 길다.
카펫의 가로, 세로 크기를 저장할 정수형 벡터 answer과 brown과 yellow의 합을 저장할 정수형 변수 size를 초기화. 제한 사항에 따르면 yellow은 1이상 이므로 세로 크기는 반드시 3이상. 따라서, for loop의 초기화식 hgt를 3으로 설정. if문을 통해 size를 높이를 나눈 나머지가 0이라면, 정수형 변수 width에 size에서 hgt를 나눈 몫을 저장하고, 갈색 격자의 수를 의미하는 정수형 변수 count에 (가로 x 2) + (높이 - 2) x 2의 연산값을 저장. 또다른 if문을 사용하여 brown이 count와 동일하고, yellow가 size - count가 동일하다면 조건을 만족하므로 width와 hgt를 순서대로 answer에 저장하고 loop 탈출. 최종적으로 저장된 answer을 return
#include <vector>
using namespace std;
vector<int> solution(int brown, int yellow) {
vector<int> answer;
int size = brown + yellow;
for(int hgt = 3; hgt <= size / 2; ++hgt) {
int width = size / hgt;
if(size % hgt == 0) {
int count = (width * 2) + (hgt - 2) * 2;
if(brown == count && yellow == size - count) {
answer.push_back(width);
answer.push_back(hgt);
break;
}
}
}
return answer;
}