프로그래밍 공부
작성일
2024. 2. 13. 12:09
작성자
WDmil
728x90

문제 설명

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]

문제 해설

사각형의 내부공간이 발생하는 원리를 생각해보자.

사각형의 가로, 세로 의 길이가 3칸이상일 경우에 내부공간이 1칸이 생긴다.

그럼으로, 가로 세로 길이의 -2만큼 한 값을 서로 곱하면 내부 공간일 것으로 이해할 수 있다.

 

그리고, brown은 외곽선이다. 외곽선의 값은 가로 + 세로 * 2 에 4를 뺀 값이 나타나게 된다. 겹치는 부분이 4칸이기 때문에, 4칸을 빼줘야한다.

 

이 방법을 유도하면 for문 하나만으로 결과값을 유도할 수 있다.

 

  • 사각형의 가로, 세로 길이가 3칸 이상일 경우 내부공간이 가로 - 2 * 세로 - 2 값만큼 나타난다.
  • 외곽선의 크기는 항상, 가로 + 세로 * 2 에 4를 뺀 값이다.

첫 시도

#include <string>
#include <vector>

using namespace std;

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

성공

 

그리 어려울 것 없다. 내부규칙을 확인하고 유도, 이해하면 쉽게 정리할 수 있다는점을 고려하자.

이 방법 대신 2차방정식을 이용해도 유도가 가능할 것 이다.

728x90

'코딩테스트 문제 풀이 > 완전탐색' 카테고리의 다른 글

모음사전  (0) 2024.02.14
피로도  (0) 2024.02.14
소수 찾기  (0) 2024.02.02
모의고사  (0) 2024.01.23
최소 직사각형  (0) 2024.01.12