반응형
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <string> #include <vector> using namespace std; vector<int> solution(int brown, int red) { vector<int> answer; int sum = brown + red; for(int i = 3; i * i <= sum; i++) { int j; if(sum % i == 0) { j = sum / i; if((j - 2) * (i - 2) == red) { if(i > j) { answer.push_back(i); answer.push_back(j); } else { answer.push_back(j); answer.push_back(i); } } } } return answer; } | cs |
이 문제는 규칙을 찾으면 간단한 문제이다.
먼저 첫번째 예시를 기준으로 설명하면 갈색이 10개, 빨간색이 2개이다. 그리고 이것의 반환 값은 4,3이다. 반환 값들의 곱은 12이고 갈색과 빨간색의 합은 12이다. 즉 반환 값은 빨간색과 갈색의 합을 두 수의 곱으로 나타낼 수 있는 값들이란 것이다. 그리고 여기서 빨간색의 값은 반환 값들을 각각 2로 뺴서 곱해준 값과 같다. 이를 두번쨰 예시와 세번째 예시에 적용해도 같은 값이 나온다.
그리고 이를 함수안에 구현을 해주면 된다.
먼저 갈색과 빨간색을 더한 값을 sum이라는 변수에 저장한다. 그래고 하나의 반복문을 둬서 이를 i * i값이 sum보다 같거나 작을때까지 반복시킨다. 그 후 sum값이 i로 나눠지고 나머지가 0이 되면 j에 나눈 몫을 할당한다. 그리고 j-2, i-2값이 빨간색값과 같을 때 i값이 j값보다 더 크다면 i값을 먼저 넣어주고 아니면 j값을 먼저 넣어준다. 이렇게 먼저 넣어주는 값을 달리한 이유는 문제에서 가로의 크기가 세로의 길이보다 같거나 더 크다고 명시해줬기 때문이다.