문제
https://school.programmers.co.kr/learn/courses/30/lessons/42842
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
#include <string>
#include <vector>
using namespace std;
int getBrown(int n, int m) {
return 2*n + 2*(m - 2);
}
int getYellow(int n, int m) {
return (n-2) * (m-2);
}
vector<int> solution(int brown, int yellow) {
vector<int> answer;
// n*m (가로 * 세로) = yellow + brown
// brown = 2n + 2(m-2)
// yellow = (n-2) * (m-2)
int total = brown + yellow;
int n, m;
for(n = total; n >= total/2; n--) {
if(total % n != 0) continue;
m = total / n;
if(brown == getBrown(n, m) && yellow == getYellow(n, m)) {
answer.push_back(n);
answer.push_back(m);
return answer;
}
}
}
풀이
getBrown, getYellow 함수는 가로(n), 세로(m) 이 주어졌을 때 brown 과 yellow 의 수를 반환해주는 함수이다.
가로 세로에 따라 brown 과 yellow 를 구하는 방식은 코드의 주석에서 알 수 있다.
brown 과 yellow 를 합하면 전체 사각형의 넓이이며 문제에서 가로가 세로보다 같거나 크다고 했기에 반복문을 전체 넓이인 total 에서 그의 절반까지 진행한다.
이때, 넓이(total)가 가로(n)로 나누어떨어지지 않는다면 불가능한 길이이기에 바로 넘어가줄 수 있다.
특정 가로(n)과 세로(m)일 때 기존에 입력된 brown, yellow 과 수가 같다면 결과로 반환한다.