APS/백준
[단계별로 풀어보기] 브루트 포스
문래동까마귀
2021. 8. 16. 16:11
1. 블랙잭
#include <iostream>
using namespace std;
int n, m;
int card[100];
int cmax = 0;
int sum;
int path[100];
int used[100];
void run(int le) {
if (le == 3) {
sum = 0;
for (int i = 0; i < 3; i++) {
//cout << path[i]<<" ";
sum += path[i];
}
//cout << sum << endl;
if (cmax < sum && sum <= m) {
cmax = sum;
}
return;
}
for (int i = 0; i < n; i++) {
if (used[i] == 1) continue;
used[i] = 1;
path[le] = card[i];
run(le + 1);
used[i] = 0;
path[le] = 0;
}
if (le == 0)
cout << cmax;
}
int main() {
cin >> n;
cin >> m;
for (int i = 0; i < n; i++) {
cin >> card[i];
}
run(0);
return 0;
}
2. 분해합
- Test1. 재귀사용 - 시간초과
#include <iostream>
#include <cmath>
using namespace std;
int m=0; //자릿수 구하기
int n; //주어진 분해합의 최소생성자 찾기
int path[8];
int mmin = 1000000;
void run(int le) {
if (le == m) {
int sum = 0;
int s=0;
for (int x = 0; x < m; x++) {
// cout << path[x] << " ";
sum += path[x];
s += path[x] * pow(10, x);
}
if (sum + s == n) {
if (mmin > s)
mmin = s;
}
//cout << endl;
return;
}
for (int i = 0; i <= 9; i++) {
path[le] = i;
run(le + 1);
path [le]= 0;
}
return;
}
int main() {
cin >> n;
int tmp = n;
while (tmp) {
tmp /= 10;
m++;
}
run(0);
if (mmin == 1000000) cout << 0;
else cout << mmin;
return 0;
}
- Test2. 재귀함수 사용X
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int m=0; //자릿수 구하기
int n; //주어진 분해합의 최소생성자 찾기
int path[8];
int mmin = 1000000;
int run(int le) {
int sum=0;
int tmp = le;
while (tmp) {
sum += tmp % 10;
tmp /= 10;
}
return sum + le;
}
int main() {
vector<int>vec;
cin >> n;
for (int i = 1; i <= n; i++) {
if (run(i) == n)
vec.push_back(i);
}
if (vec.empty()) {
cout << 0;
return 0;
}
else {
int size = vec.size();
for (int i = 0; i < size; i++)
{
if (mmin > vec[i])
mmin = vec[i];
}
}
cout << mmin;
return 0;
}
3. 덩치
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
vector<pair<int, int>>vec;
vector<int> result;
int n;
void check(int i) {
for (int x = 0; x < n; x++) {
if (i == x)continue;
if (vec[i].first < vec[x].first && vec[i].second < vec[x].second) {
result[i]++;
}
}
}
int main() {
int cm, kg;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> cm >> kg;
vec.push_back(make_pair(cm, kg));
result.push_back(1);
}
for (int i = 0; i < n; i++) {
check(i);
}
for (int i = 0; i < n; i++) {
cout << result[i] << " ";
}
return 0;
}
4. 체스판 다시 칠하기
-> 비교함수부분 비교조건 앞으로 잘보자..
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int n, m; //n행, m열
char map[50][50];
char bkmap[9][9] = {
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB"
};
char wtmap[9][9] = {
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW"
};
int check(int y, int x) {
int bc = 0, wc = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if(map[y+i][x+j] != bkmap[i][j])bc++; //비교조건 확인..
else if (map[y+i][x+j] != wtmap[i][j]) wc++;
}
}
if (bc >= wc) return wc;
else return bc;
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cin >> map[i][j];
}
int min = 100;
for (int a = 0; a <= n - 8; a++) { //y
for (int b = 0; b <= m - 8; b++) { //x
int result = check(a, b);
if (min >= result)
min = result;
}
}
cout << min;
return 0;
}
5. 영화감독 숌
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
vector<int>vec;
void check(int i) {
string tmp = to_string(i);
if (tmp.find("666", 0) != -1)
vec.push_back(i);
}
int main() {
int n;
cin >> n;
int a = 666;
while (1) {
check(a);
if (vec.size() == n)
break;
a++;
}
cout << vec.back();
return 0;
}