알고리즘/프로그래머스

[프로그래머스] Level 2 카펫 cpp

고줭 2021. 5. 3. 18:50

카펫

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

brown    yellow    return

10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

출처

※ 공지 - 2020년 2월 3일 테스트케이스가 추가되었습니다.
※ 공지 - 2020년 5월 11일 웹접근성을 고려하여 빨간색을 노란색으로 수정하였습니다.


우리는 언제나 문제에 마주하면 "어떻게 해야할까?" 를 먼저 생각해야합니다.

처음으로 눈에 띈것은 예제에
brown + yellow = return갑의 0번째 * 1번째 라는 규칙이 있습니다.

#include <string>
#include <vector>
#include <math.h>

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    int carpet = brown + yellow;
    
    for(int i=2; i<=carpet; i++){
        if(carpet % i == 0){
            if(i >= floor(carpet/i)){
                answer.push_back(i);
                answer.push_back(carpet/i);
                break;
            }
        }
    }
    return answer;   
}

첨엔 이런식으로 풀이를 생각했지만 테스트케이스 4, 6, 7에서 실패가 납니다.

만약 brown = 22, yellow = 8인 경우

ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ
ㅁㅇㅇㅇㅇㅇㅇㅇㅇㅁ
ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ
[10, 3]이 돼야하는데 

ㅁㅁㅁㅁㅁㅁ
ㅁㅁㅇㅇㅁㅁ
ㅁㅁㅇㅇㅁㅁ
ㅁㅁㅇㅇㅁㅁ
ㅁㅁㅁㅁㅁㅁ

[6, 5]이런식으로 되기 때문입니다

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    int carpet = brown + yellow;
    
    for(int i=2; i<=carpet; i++){
        if(carpet % i == 0){
            int width = i;
            int height = carpet/i;
            if(width >= height){
                if((width-2) * (height-2) == yellow){
                    answer.push_back(i);
                    answer.push_back(height);
                    break;
                }
            }
        }
    }
    return answer;   
}

검색결과 width와 height이름으로 하는것이 더 깔끔하고 직관적으로 보여서 변수를 선언하고
위에서 말한듯 우리는 상하좌우 brown을 각 1칸씩 즉 상하에 2 좌우에 2를 빼고 곱한값이 yellow와 같다면 우리가 찾는 답을 얻을 수 있습니다.

어떤분들은 첫 for문에서 i=carpet/2로 시작하고 i를 빼면서 하시던데 이렇게 해도 시간은 잘 나오기에 저는 증가식으로 했습니다.

예외적인 테스트케이스로 어려움을 겪는것... 예상치 못한 변수나 상황들이 당황케하는데 코테 문제풀이는 마치 우리네 인생이 아닐까요?