https://www.acmicpc.net/problem/2798
코드 (C)
#include <stdio.h>
int main()
{
int a, max, sum, result=0, arr[101];
scanf("%d %d", &a, &max);
for (int i = 0; i < a; i++) scanf("%d", &arr[i]);
for (int i = 0; i < a - 2; i++)
{
for (int j = i + 1; j < a - 1; j++)
{
for (int k = j + 1; k < a; k++)
{
sum = arr[i] + arr[j] + arr[k];
if (sum <= max && sum > result) result = sum;
}
}
}
printf("%d", result);
return 0;
}
코드 (C++)
#include <iostream>
using namespace std;
int main()
{
int a, max, num[101], result=0, sum;
cin >> a >> max;
for (int i = 0; i < a; i++) cin >> num[i];
for (int i = 0; i < a - 2; i++)
{
for (int j = i+1; j < a - 1; j++)
{
for (int k = j+1; k < a; k++)
{
sum = num[i] + num[j] + num[k];
if (sum <= max && sum > result) result = sum;
}
}
}
cout << result;
return 0;
}
코드설명
카드의 개수와 M(==max)을 입력받는다.
이후 반복문으로 카드의 개수만큼 카드에 쓰여있는 수를 입력받는다.
다시 반복문을 도는데, 합이 max를 넘지 않는 카드 3장의 합을 구해야 하므로 반복문을 중첩하고 한 번 더 중첩해서 총 3개의 반복문으로 모든 경우를 탐색한다.
합이 max를 넘지 않으면서 이전의 최댓값보다 큰 경우 값을 바꾼다.
이후 반복문이 종료된 후 결과를 출력한다.
느낀 점
일단 어떻게 짜야할지 구상은 했는데, 값을 구해나가는 과정을 조금 고민했다. 반복문이 한 번만 중첩돼서 이중 for문을 돌아도 시간이 꽤 걸릴 텐데, 시간초과가 되진 않을까 걱정했다. 일단 해보고 실패하면 다른 방법을 찾아볼 생각이었는데, 다행히도 한 번에 통과했다!
'PS (C, C++)' 카테고리의 다른 글
[백준/C & C++] 11050 이항 계수 1 (2) | 2022.10.05 |
---|---|
[백준/C & C++] 2914 저작권 (2) | 2022.10.04 |
[백준/C & C++] 5354 J박스 (0) | 2022.10.04 |
[백준/C & C++] 2576 홀수 (0) | 2022.09.19 |
[백준/C & C++] 1233 주사위 (0) | 2022.09.19 |