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++;
}
}
'vidigummy KAU > 알고리즘 공부(백준!)' 카테고리의 다른 글
BOJ 1992 쿼드트리 (0) | 2021.01.08 |
---|---|
BOJ 2630 색종이 만들기 (0) | 2021.01.08 |
오늘은 프로그래머스를 했다.(고득점 KIT 정렬) (0) | 2020.08.30 |
BOJ 10610 (30)(그리디 알고리즘) (0) | 2020.08.24 |