https://www.acmicpc.net/problem/1233
코드
C
#include <stdio.h>
int main()
{
int s1, s2, s3, sum[81] = { 0 };
scanf("%d %d %d", &s1, &s2, &s3);
int max = s1 + s2 + s3, min = 3, result = 1, index;
for (int i = 1; i <= s1; i++)
{
for (int j = 1; j <= s2; j++)
{
for (int k = 1; k <= s3; k++)
{
sum[i + j + k]++;
}
}
}
for (int i = 3; i <= max; i++)
{
if (sum[i] > result)
{
result = sum[i];
index = i;
}
}
printf("%d", index);
return 0;
}
C++
#include <iostream>
using namespace std;
int main()
{
int s1, s2, s3, sum[81] = { 0, };
cin >> s1 >> s2 >> s3;
int min = 3;
int max = s1 + s2 + s3;
for (int i = 1; i <= s1; i++)
{
for (int j = 1; j <= s2; j++)
{
for (int k = 1; k <= s3; k++)
sum[i + j + k]++;
}
}
int result = 1, index = 0;
for (int i = 3; i <= max; i++)
{
if (sum[i] > result)
{
result = sum[i];
index = i;
}
}
cout << index;
return 0;
}
코드설명
주사위 면의 최댓값을 전부 더하면 20+20+40=80이다. 그렇기 때문에 주사위 합의 최솟값은 3이고 최댓값은 80이다. 합 자체를 인덱스로 갖는 배열을 선언하고, 배열의 값에 빈도를 저장한다.
반복문을 중첩해서 계속 합을 구해가면서 배열에 값들을 저장해나간다.
반복문이 끝난 후 다시 3부터 80까지 반복문을 돌면서 배열에 저장된 값이 최대인 인덱스를 찾는다.
반복문이 끝나면 구한 인덱스 값을 출력하고 프로그램을 종료한다.
느낀 점
처음에 반복문을 중첩해서 코드를 짜면서 시간초과가 날까봐 걱정을 했다. 다행히 이 부분은 문제가 없었다. 시간복잡도에 대해서는 정의와 특정 정렬에서 어느 정도의 시간복잡도를 갖는지 정도만 알고 있는데, 좀 더 제대로 공부할 필요성을 느꼈다.
다만 처음에 문제를 풀 때 순간 착각해서 반복문 내 코드를 잘못 짰었다. 하필 문제 내 제시된 예제에서는 값이 나와서 아무 생각 없이 제출했다가 계속 틀렸다길래 당황했었다. 다시 코드를 파악했고 틀린 걸 찾아 수정하니 바로 통과했다!
'PS (C, C++)' 카테고리의 다른 글
[백준/C & C++] 5354 J박스 (0) | 2022.10.04 |
---|---|
[백준/C & C++] 2576 홀수 (0) | 2022.09.19 |
[백준/C & C++] 3034 앵그리 창영 (0) | 2022.09.15 |
[백준/C & C++] 2577 숫자의 개수 (0) | 2022.09.15 |
[백준/C & C++] 25305 커트라인 (0) | 2022.09.15 |