본문 바로가기

Coding Tests/백준 온라인

(C언어) 백준 온라인 2798번-블랙잭

<블랙잭 2798번>

 


<첫 생각>

처음 이문제에 접근할 때는 , 반복문을 세 번 중첩을 해 세수를 더해, 입력받은 M에서 이 세수를 더한 것을 빼, 이 뺀 값을 각 배열 요소에 넣어 min값을 구하여 이 min값이 나온 그 해당 세수가 답으로 출력되게끔 하려 했었다. 

그런데 이 방법은 옳지 않은 방법일 뿐더러, 이 방법을 구현하지 못한 가장 큰 이유는 for문의 중첩을 완전하게 이해하고 있지 못함에 있었던 것 같다. 특히 삼중중첩을 사용해본 경험이 드물다 보니까 더 그랬던 것 같다. 그래서 처음 이 문제의 풀이를 볼 때, 삼중 중첩을 어떻게 사용을 했을까? 에 초점을 맞춰서 풀이를 보았는데, 나 스스로 개념을 잘 잡지 못하고 있으니 풀이를 봐도 명확한 느낌이 들지 않았다. 그래서 직접 for문의 삼중 중첩을 만들어 결괏값을 출력해보았고, 비로소 잘못된 생각을 바로 잡을 수 있었다.   


<정답 풀이>

#include<stdio.h>
int main(void)
{
	int N;
	int M;
	scanf("%d %d", &N, &M);
	int number[100];
	int sum;
	int max = 0;

	for (int i = 0; i < N; i++)
		scanf("%d", &number[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 = number[i] + number[j] + number[k];
				
				if ((sum >= max) && (sum <= M))
					max = sum;
			}
		}
	}
	printf("%d", max);

	return 0;
}

for문을 잘못 이해하고 있으니, 어떤 방법으로 풀려 해도 되지 않았다. 또, 처음에는 int sum을 통해 비교를 하는 것을 생각하지는 않았는데, 다른 풀이를 참고하는 과정에서 이렇게 풀면 더 간단하고 쉽게 풀 수 있겠다 라는 생각이 들어 이해하고 작성한 코드이다.


<for문 중첩의 이해>

마지막 for문이 조건이 만족이 되어, 끝이 나게 되면 어디부터 시작이 될까? 첫번째? 두 번째 for문?

#include<stdio.h>
int main(void)
{
	int i, j, k;
	for (i = 3; i < 7; i++) {
		for (j = 2; j < 6; j++) {
			for (k = 1; k < 5; k++) {
				printf("%dx%dx%d = %d\n", i, j, k, i * j * k);
			}
			printf("\n");
		}
		printf("\n");
	}
	return 0;
}

만들어본 이 예시를 통해서 부족했던 for문의 중첩에 관한 개념을 분명히 할 수 있었다.