문제
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
전체 카펫의 가로, 세로 길이 구하기
풀이
전체 카펫 안의 노란색 카펫의 개수와,
이를 감싸는 갈색 카펫의 개수가 주어져있다.
전체 카펫은 노란색 카펫과 갈색 카펫으로 이루어져 있으므로
전체 카펫의 개수는 아래와 같다.
전체 카펫의 개수 = (노란색 카펫의 개수) + (갈색 카펫의 개수)

자세히 생각해보면 노란색 카펫의 바로 위로 갈색 카펫이 덮고 있으므로
전체 카펫에 대한 노란색 카펫의 개수는 아래와 같다.
전체 카펫의 가로 길이 = 노란색 카펫의 가로 길이 + 2
전체 카펫의 세로 길이 = 노란색 카펫의 세로 길이 + 2
따라서, 이 두 가지 조건과
문제에서 주어진 조건을 만족하는 가로, 세로를 구하면 된다.
1. 가로의 길이 >= 세로의 길이
2. 노란색 카펫의 개수 + 갈색 카펫의 개수 = 가로의 길이 * 세로의 길이
3. 노란색 카펫의 개수 = (가로의 길이 - 2) * (세로의 길이 - 2)
코드
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int brown, int yellow) {
// 카펫 격자의 개수 = width * height = brown + yellow
// 그런데, yellow 격자의 가로, 세로에서 2를 더해서 곱하면 전체 카펫과 같으므로
// (width-2)(height-2) = yellow
// 따라서 이를 만족하는 width, height를 구하면 된다
vector<int> answer;
int size = brown + yellow;
// 최소 길이 3부터 시작해서 최대 길이까지 조건을 만족하는 경우 찾기
for (int height = 3; height <= size / 2; ++height){
int width = size / height;
// 나누어 떨어지는 경우만 가능성 있음
// 문제 조건에서 가로가 더 길다고 했으므로 이 경우 조건에 넣기
if (size % height == 0 && width >= height){
if (yellow == (width - 2) * (height - 2)){
// 조건 만족할 시 정답 배열에 넣고 for문 break
answer.push_back(width);
answer.push_back(height);
break;
}
}
}
return answer;
}
회고
처음에는 단순히 방정식을 세우는 것까지는 어렵지 않았는데,
그 식을 실제 코드 흐름 안에서 어떻게 풀어낼지가 가장 고민이 많이 되었던 문제이다.
특히, (width - 2) * (height - 2) = yellow 조건과
width * height = brown + yellow 조건을 동시에 만족시키면서,
가로가 세로보다 길거나 같은 형태를 어떻게 코드로 표현할지 고민했다.
또한, 방정식을 코드로 옮기는 과정에서
계산식과 조건문이 자연스럽게 연결되도록 설계하는 게 중요하다는 점을 배웠다.
앞으로 비슷한 규칙 찾기 문제를 만났을 때,
먼저 수학적 조건을 코드 흐름에 어떻게 녹일까? 를 생각하며 접근해야겠다고 느꼈다.