vidigummy KAU/알고리즘 공부(백준!)

코테 준비반 2일차 (프로그래머스 고득점 KIT 완전 탐색 (모의고사, 소수 찾기, 카펫))

vidi 2020. 8. 31. 17:08

2일차다. 완전탐색

1. 모의고사

비교문 작성만 잘 해주면 되는 문제였다. 아닐 수도 있다. 그냥 무식하게 했다.

 

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> arr = { 0,0,0 };
    vector<int> dumbass1 = { 1,2,3,4,5 };
    vector<int> dumbass2 = { 2,1,2,3,2,4,2,5 };
    vector<int> dumbass3 = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 };
    int DP1 = 5, DP2 = 8, DP3 = 10;
    for (int i = 0; i < answers.size(); i++)
    {
        if (dumbass1[i % DP1] == answers[i])
        {
            arr[0] ++;
        }
        if (dumbass2[i % DP2] == answers[i])
        {
            arr[1] ++;
        }
        if (dumbass3[i % DP3] == answers[i])
        {
            arr[2] ++;
        }
    }
    if (arr[0] == arr[1] && arr[1] == arr[2])
        return { 1, 2, 3 };
    else if (arr[0] == arr[1] && arr[1] > arr[2])
        return { 1, 2 };
    else if (arr[0] > arr[1] && arr[0] == arr[2])
        return { 1,3 };
    else if (arr[0] < arr[1] && arr[1] == arr[2])
        return { 2, 3 };
    else if (arr[0] > arr[1] && arr[0] > arr[2])
        return { 1 };
    else if (arr[0] < arr[1] && arr[1] > arr[2])
        return { 2 };
    else if (arr[2] > arr[0] && arr[2] > arr[1])
        return { 3 };
}

 

2. 소수 찾기

1. 저 수의 조합으로 만들 수 있는 최대의 숫자를 정해놓고 그 숫자까지 에라토스테네스의 체를 사용하여 판별한다. 코드는 길 필요 없었지만 그냥 번거로웠다.

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int* era = (int*)malloc(sizeof(int) * 10000000); 
void Era(int num) 
{
	era[0] = 1; 
	for (int i = 1; i < num; i++)
		era[i] = 0;
	for (int i = 1; i < num / 2; i++) 
	{ 
		if
		(era[i] == 1)
			;

		else
		{ 
			for (int j = 2; j < (num / (i + 1)) + 1; j++) 
			{ 
				era[((i + 1) * j) - 1] = 1;
			} 
		} 
	}
}


int solution(string numbers)
{
	vector<int> arr;
	string max = "";
	
	for (int i = 0; i < numbers.length(); i++)
	{
		arr.push_back(numbers[i] - 48);
	}
	sort(arr.begin(), arr.end(), greater<int>());
	if (arr[0] == 0)
	{
		return 0;
	}
	for (int i = 0; i < arr.size(); i++)
	{
		max += to_string(arr[i]);
	}
	Era(stoi(max)+1);//최대값까지 에라토스테네스의 체를 쳐놓음(소수 판별)
	int ans = 0;
	for (int i = 1; i <= stoi(max); i++)
	{
		string tmp = numbers;
		string cmp = to_string(i);
		bool right = true;
		for (int j = 0; j < cmp.length(); j++)
		{
			int where =	tmp.find(cmp[j]);
			if (where == string::npos)
			{
				right = false;
				break;
			}
			else
			{
				tmp.erase(where,1);
			}
		}
		if (right == false)
			;
		else
		{
			if (era[i-1] != 1)
			{
				ans++;
				cout << "write :  " << cmp << endl;
			}
		}
	}
	return ans;
}

3. 카펫

그냥 둘레에 갈색이 있고 중앙엔 노란색이 있도록 배치해주면 되는 문제였다. 화난다.

고민 많이 했는데.

 

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<int> solution(int brown, int yellow) 
{

    vector<int> answer;
    int total = brown + yellow;
    int y = 3;
    while (1)
    {
        if (total % y == 0)//노랭이 들어가야하니까 3부터 시작
        {
            int x = total / y;
            //2개 좌우상하 갈색이니까
            if ((x - 2) * (y - 2) == yellow)//나머지가 yellow 넓이라면
            {
                answer.push_back(x);
                answer.push_back(y);
                return answer;
            }
        }
        y++;
    }
}