PS (C, C++)

[백준/C & C++] 1233 주사위

최연재 2022. 9. 19. 04:04

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

 

1233번: 주사위

지민이는 주사위 던지기 게임을 좋아하여 어느 날 옆에 있는 동호를 설득하여 주사위 던지기 게임을 하자고 하였다. 총 3개의 주사위가 있다. 그리고 이 주사위는 각각 S1(2 ≤ S1 ≤ 20), S2(2 ≤ S2

www.acmicpc.net

코드

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