Post

Programmers_BruteForce03 - 카펫

프로그래머스 -카펫 문제 입니다.

1. 문제

https://programmers.co.kr/learn/courses/30/parts/12077


2. 분류 및 난이도

Programmers 문제입니다.
level 2의 문제입니다.


3. 생각한 것들(문제 접근 방법)

  • 문제 자체는 어렵지 않았으나, 왜인지 모르게 Testcase1에서 계속 틀림….
    • 사람들이 많이 풀지도 않았고, 나와 공통된 질문도 없어서 소인수분해로 문제를 풀기 시작했습니다.
    • 소인수 분해를 하면서 다른사람들의 질문을 보니 점화식이 존재.. brown = (yellow의 가로 + yellow의 세로 +2) * 2 이라는 식이 있었음..
    • 그래서 그걸 이용해서 코드를 짰습니다.

틀린 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <string>
#include <vector>
#include<iostream>

using namespace std;

bool checking(int tempbrown, int tempyellow, int brown, int yellow)
{
	for (int i = yellow; i > 0; --i)
	{
		if (yellow%i == 0)
		{
			if (tempbrown > i && tempyellow - 1 > (yellow / i))
			{
				cout << tempbrown << " " << tempyellow << " " << i << " " << yellow << '\n';
				return true;
			}
		}
	}
	return false;
}

vector<int> solution(int brown, int yellow) {
	vector<int> answer;
	int sum = brown + yellow;
	for (int i = sum; i >= 1; --i)
	{
		if (sum%i == 0)
		{
			if (i <(sum / i))
				return answer;
			int tempyellow = sum / i;
			if (tempyellow != yellow)
			{
				bool check = checking(i, tempyellow, brown, yellow);
				if (check)
				{
					answer.push_back(i);
					answer.push_back(tempyellow);
					return answer;
				}
			}
		}
	}
	return answer;
}

4. 접근 방법을 적용한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <string>
#include <vector>
#include<iostream>

using namespace std;

bool checking(int tempbrown, int tempyellow, int brown, int yellow)
{
	for (int i = yellow; i > 0; --i)
	{
		if (yellow%i == 0)
		{
			if (tempbrown > i && tempyellow - 1 > (yellow / i))
			{
				cout << tempbrown << " " << tempyellow << " " << i << " " << yellow << '\n';
				return true;
			}
		}
	}
	return false;
}

vector<int> solution(int brown, int yellow) {
	vector<int> answer;
	vector<int> sosu;
	int sum = brown + yellow;
	sosu.push_back(1);
	for (int i = 2; i <= yellow / 2; ++i)
	{
		if (yellow%i == 0)
		{
			sosu.push_back(i);
			cout << i<<" ";
		}
	}

	for (size_t i =0 ; i<sosu.size();++i)
	{
		int div = yellow / sosu[i];
		int result = (div + sosu[i] + 2) * 2;
		if (result == brown)
		{
			answer.push_back(div + 2);
			answer.push_back(sosu[i] + 2);
			break;
		}
	}
	return answer;
}

5. 결과

테케1 틀린거에서 1시간 가까이 쓴 것 같습니다.

This post is licensed under CC BY 4.0 by the author.