<블랙잭 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문의 중첩에 관한 개념을 분명히 할 수 있었다.