https://school.programmers.co.kr/learn/courses/30/lessons/42842
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
오늘은 프로그래머스에 있는 완전탐색 문제 카펫을 풀어봤습니다!
처음에 공식을 찾으면서 풀려고 하다보니 소요시간은 30분 정도 걸린 것 같습니다ㅠㅠ
풀이 시작하겠습니다!
문제설명
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] |
문제풀이
저는 맨처음에 문제를 읽고 공식을 찾으려고 했고 문제를 읽다보니 몇가지 공식이 보였습니다.
(x = 세로길이, y = 가로길이)
1. 부피는 xy이며 이는 각각 칸을 차지하는 brown + yellow와 같다. 즉, xy = brown + yellow
2. 둘레는 (x+y)2이며 이는 테두리인 brown에 +4(겹치는 꼭짓점 부분)를 더한 값이다. 즉, x + y = (brown + 4) / 2
이 두가지 공식을 찾았고 1번처럼 brown+yellow값의 약수의 쌍(x,y)을 찾은 후, 2번 공식 x + y = (brown + 4) / 2에 대입하여 나오는 결과를 찾아내면 되는 문제라는 것을 알았습니다!
그래서 나온 코드는
static void Main(string[] args)
{
int brown = 10;
int yellow = 2;
int[] answer = new int[2];
// 부피는 xy이며 이는 각각 칸을 차지하는 brown + yellow와 같다. 즉, xy = brown + yellow
// 둘레는 (x+y)2이며 이는 테두리인 brown에 +4(겹치는 꼭짓점 부분)를 더한 값이다. 즉, x + y = (brown + 4) / 2
int a = brown + yellow;
int b = (brown + 4) / 2;
//a의 약수의 쌍을 구한 뒤 약수의 쌍의 합이 b인 것을 구하면 된다.
// 중복되는 약수의 쌍을 제외하기 위하여 제곱근을 한 값까지만 구한다.
for (int i = 1; i <= Math.Sqrt(a); i++)
{
if (a % i == 0)
{
int y = a / i;
if (i + y == b)
{
answer[1] = i;
answer[0] = y;
}
}
}
foreach (int i in answer)
Console.WriteLine(i);
}
이렇게 나왔고 모두 통과할 수 있었습니다!
느낀점
이번 문제에서는 공식을 찾는 시야를 조금 더 키워야겠다는 생각을 하게 되었습니다!
그리고 앞으로 더욱 어려운 문제를 짧은 시간에 풀수 있도록 더욱 훈련하겠습니다!
감사합니다!
'코딩테스트' 카테고리의 다른 글
| 의상_해시 (프로그래머스 LV2) (0) | 2025.06.11 |
|---|
