본문 바로가기
C++

[Algorithm] 브루트 포스 백준 2798번 블랙잭, 2231번 분해합 | C++

by 유일리 2022. 5. 13.

※ 2798 블랙잭

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

#include <iostream>

using namespace std;

int main() {
	int N, M, a[100]; //N: 카드의 개수, a: 카드의 숫자를 저장하는 일차원 배열
	int sum = 0, near = 0;
	
	//입력
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		cin >> a[i]; //카드의 숫자 입력
	}

	//완전 탐색(N장의 카드 중 3장의 카드 조합의 경우의 수)
	for (int i = 0; i < N; i++) {
		for (int j = i+1; j < N; j++) {
			for (int k = j + 1; k < N; k++) {
				sum = a[i] + a[j] + a[k]; //각 경우의 수마다 3장의 숫자 합을 sum에 저장
				//sum이 M보다 작거나 같고 기존 near값보다 크다면 새로운 near값으로 갱신
				if (near < sum&&sum <= M) {
					near = sum;
				}
			}
		}
	}

	//출력
	cout << near;
}

※ 2231 분해합

https://www.acmicpc.net/problem/2231

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

#include <iostream>

using namespace std;

int main() {
	int n, a;

	//입력
	cin >> n;

	//완전 탐색 
	for (int i = 0; i <= n; i++) { //0과 n 사이의 생성자 찾기
		int sum = i;
		int tmp = i;

		while (tmp > 0) {
			//각 자릿수 더하는 로직 (몫과 나머지를 통해 각 자릿수 떼어내기)
			sum += (tmp % 10); //기존 sum에 오른쪽 끝자리 수 합하기
			tmp /= 10; //합한 오른쪽 끝자리 수 제거
		}
		if (n == sum) { //분해합이 n과 같아질 경우 생성자 출력
			cout << i;
			a++;
			break;
		}
		else { //분해합이 n과 같은 경우가 없을 때 생성자 0
			a = 0;
		}
	}

	if (a == 0) { //생성자 0 출력
		cout << "0";
	}
}

댓글