AlgorithmTest/프로그래머스/2/42842. 카펫 at main · GyungSikHan/AlgorithmTest
This is an auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - GyungSikHan/AlgorithmTest
github.com
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int brown, int yellow) {
vector<int> answer;
for(int i = 1; i <= yellow; i++)
{
int x = yellow / i;
if(yellow % i == 0)
{
if(brown == 2*x+ 2*i+4)
{
answer.push_back(x+2);
answer.push_back(i+2);
break;
}
}
}
return answer;
}
- 아이디어가 떠오르지 않아 꽤 애를 먹었다
- 일단 yellow의 가로를 x, 세로를 y 라 한다면 yellow의 넓이는 x*y일것이다
- 그렇다면 x = yellow/y가 될것이다
- 이를 활용해 brown의 값을 구할 수 있는데 (x+2)*(y+2)-xy로 그 이유는 카펫의 패턴의 특징에 있다
- x+2, y+2에서 +2를 하는 이유는 가운데 yellow가 들어가는 카펫은 겉에 brown 색이 yellow의 가로,세로보다 무조건 +2가 된 값을 갖게된다
- 이해가 되지 않는다면 여러개 패턴을 그려보면 쉽게 이해된다
- 이제 전체 넓이인 (x+2)*(y+2)에 yellow인 xy 뺀다 생각하면 brown의 넓이를 구할 수 있는데, 이렇게 나온 점화식이 (x+2)(y+2)-xy 이다
- 이를 활용해 전체 카펫의 가로 세로를 구할 수 있는데, 이때 생각해봐야하는 문제가 yellow/y 가 나머지가 0인 딱 나누어 떨어지는 수여야 한다
- 이를 모두 충족하게 구현한다면 위의 코드가 나온다
- 이때 for문을 돌려 모든 조건을 충족한다면 break로 반복문을 종료하는 이유는 점화식을 풀어보면 기본적으로 x,y값이 2가지가 존재하는데 문제 조건에서 가로가 무조건 세로보다 크다는 조건을 만족하기 위해서 반복문에서 조건을 모두 충족하는 가장 작은 i 값을 구하여 반복문을 종료하는 것이다
- 마찬가지로 answer의 x,y에 +2를 하는 이유는 위의 설명했듯이 패턴때문이다
//코드에서 i 를 사용했지만 y라 생각하면 됨
'코딩 태스트 > 문제풀이' 카테고리의 다른 글
연산자 끼워넣기-14888 (0) | 2025.03.19 |
---|---|
코딩테스트 책 - 모의고사 (0) | 2025.03.17 |
피보나치 수 - 12945 (0) | 2025.03.13 |
이진 변환 반복하기 - 70129 (0) | 2025.03.11 |
JadenCase 문자열 만들기 - 12951 (0) | 2025.03.11 |