문제 설명

카펫의 갈색 격자의 수와 노란색 격자의 수가 주어졌을 때 카펫의 가로, 세로 크기를 return

https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이법

우선 가로 세로의 크기를 탐색하기 위해서 이중 for문을 두었다

겉의 for문은 가로의 길이고, 안의 for문은 세로의 길이이다

문제에서 가로의 길이가 세로의 길이보다 같거나 더 길다고 했으니, 안의 for문이 끝나는 조건은 세로의 길이가 가로의 길이보다 클 때이다

 

'brown + yellow'의 값과 '가로 * 세로'의 값이 같은 경우에만 탐색할 수 있게 조건문을 걸어주었다

 

이제, 구한 가로의 길이와 세로의 길이를 통해 문제에서 주어진 갈색과 노란색의 개수가 일치하는지 알아보면 된다

문제 설명을 보면 카펫의 테두리는 갈색이고, 중앙은 노란색이다

따라서 갈색의 개수를 통해서 우리가 구한 가로의 길이와 세로의 길이가 문제에서 원하는 카펫인지 검사하면된다

 

검사를 하는 방식은 갈색은 테두리니까 (가로의 길이 * 2)를 우선 구해준다

가로의 길이 * 2를 하게 되면 카펫의 위,아래 테두리의 값을 구한 것이다

위 아래 테두리

 

이제 좌,우의 테두리의 값을 구하기 위해 {(세로의 길이 - 2) * 2}를 구해준다

(세로의 길이 - 2)를 한 이유는 위, 아래를 빼준 것이다

여기에 * 2를 하여 좌, 우의 테두리 길이를 구하여준다

좌 우 테두리

 

이렇게 구한 갈색의 개수가 문제에서 주어진 갈색의 개수가 맞다면 answer에 값을 넣고 바로 return 한다

 

 

소스 코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    
    for (int i = 1; i <= 5000; i++) {
        for (int j = 1; j <= i; j++) {
            if (i * j < brown + yellow)
                continue;
            else if (i * j > brown + yellow)
                break;
            
            int brown_cnt = i * 2;
            brown_cnt += (j - 2) * 2;
            
            if (brown_cnt == brown) {
                answer.push_back(i);
                answer.push_back(j);
                return answer;
            }
            
        }
    }
    return answer;
}
복사했습니다!