1. 문제 상세
https://www.acmicpc.net/problem/2798
2. 문제 접근
카드 갯수 N, 숫자 M, 카드의 수들을 입력받는다.
카드 갯수는 최대 100개 까지 입력받을 수 있으므로 카드 수들을 저장할 크기 100의 정수 배열을 사용하자.
먼저 반복문을 카드 갯수만큼 반복하며 정수를 입력받아 카드 수 배열에 저장한다.
이제 모든 카드에서 세 개를 골라 더한 후 그 수가 M 보다 작거나 같은지 확인하자.
그리고 M 과 최대한 가까운지 확인하기 위해 블랙잭을 저장할 변수를 선언하여 0으로 초기화 한 후 세 카드의 합이 변수의
값보다 클 때 그 합을 변수에 저장하도록 하자.
카드 배열에서 입력한 카드 수들은 배열의 n - 1 번 인덱스 까지 저장되어 있다.
모든 카드 조합을 확인하기 위해서 3중 반복문을 사용하자.
순서대로 반복문 변수 i, j, k 가 있을 때, i 는 1부터 n - 1 까지 반복, j 는 i + 1부터 n - 1까지, k 는 j + 1부터 n - 1까지 반복한다.
반복에서는 카드 배열의 i, j, k 번 카드의 수를 더하여 그 값이 m 보다 작거나 같고, 블랙잭 값보다 크면 블랙잭으로 저장하자.
3. 문제 풀이
#include <iostream>
using namespace std;
int main() {
int n, m, card[100], bj = 0, sum;
cin >> n >> m;
for (int i = 0; i < n; i++) cin >> card[i];
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = j + 1; k < n; k++) {
sum = card[i] + card[j] + card[k];
if (m >= sum && bj <= sum) bj = sum;
}
}
}
cout << bj;
}
정수형 변수 n, m, bj, sum 을 선언하고 bj 를 0으로 초기화한다.
크기가 100인 정수형 배열 card 를 선언한다.
cin 으로 정수(카드 갯수 N, 숫자 M)를 입력받아 각각 n, m 에 저장한다.
for문으로 i 가 0부터 n 보다 작을 때 1씩 더하며 반복한다.
반복에서는 cin 으로 정수를 입력받아 card 배열의 i 번 인덱스의 값으로 저장한다.
for문으로 i 가 0부터 n 보다 작을 때 1씩 더하며 반복한다.
다시 중복 for문으로 j 가 i + 1부터 n 보다 작을 때 1씩 더하며 반복한다.
다시 중복 for문으로 k 가 j + 1부터 n 보다 작을 때 1씩 더하며 반복한다.
반복에서는 sum 에 card 의 i, j, k 번 인덱스의 값들을 더해 저장한다.
if문으로 sum 이 m 보다 작거나 같고, bj 보다 크거나 같을 때 bj 에 sum 의 값을 저장하도록 한다.
모든 반복이 끝나면 cout 으로 bj 의 값을 출력한다.
4. 성능 확인
5. 마무리
.
'백준 - 단계별로 풀어보기 > 브루트 포스' 카테고리의 다른 글
[백준] 2839번 : 설탕 배달 | C++ (0) | 2023.11.01 |
---|---|
[백준] 1436번 : 영화감독 숌 | C++ (0) | 2023.11.01 |
[백준] 1018번 : 체스판 다시 칠하기 | C++ (0) | 2023.11.01 |
[백준] 19532번 : 수학은 비대면강의입니다 | C++ (1) | 2023.10.31 |
[백준] 2231번 : 분해합 | C++ (0) | 2023.10.31 |