티스토리 뷰

728x90

평소 수학에 관심을 가지고 있는 사람이 아니면 수열 문제 만큼 머리 아픈 것도 없을 것입니다. 그렇지만 프로그래밍은 단순한 "코딩"이기 보다는 "문제 해결"이 목적이고, "문제 해결"의 첩경은 집중력 있는 관찰과 그를 바탕으로한 적절한 해결책을 제시하는 것이므로 이런 관점에서 수열 문제는 면밀한 관찰을 통해서 단서를 찾고 대상이 아닌 부분을 배제하며 해결책을 찾으려는 태도가 꼭 필요합니다.

24. 다음 프로그램의 출력이 “2 5 10 17 26 ”이 되도록 _________부분에 들어갈 코드는 무엇인가?
    int i;
    i = 1;
    while (i <= 5) {
        printf("%d ", _______);
        i++;
    }
    printf("\n");
① i * i ② i + (i - 1) ③ i * (i + 1) ④ i / i + 1 ⑤ i * i + 1

위의 문제에서는 다행스럽게도 제시된 수열의 항의 개수가 5개라는 반가운 점이 있습니다. 만약에 항에 개수가 5개가 아니라 500나 5000개 라면 어떻게 될까요? 언뜻 보기에는 어렵거나 복잡할 것 같지만 프로그램의 관점에서는 두서너개의 항을 대입해서 문제가 없다면 항의 개수가 아무리 많아도 달라질 것은 없는 것입니다. 우선은 1번부터 첫번째 항을 대상으로 대입해 봅니다.

첫번째 항은 i=1일때 수행하는 것이므로 1번은 1*1=1이므로 아니고 2번도 1+(1-1)=1이므로 아니고 3,4,5번 보기만 값이 2로 첫번째 항에 대해서는 보기 2개가 걸러졌습니다. 이제 3,4,5번 보기에 대해서 i=2인 두번째 항을 검증해 보면 3번은 2*(2+1)=6, 4번은 2/2+1=2, 5번은 2*2+1 = 5로 5번만이 수열과 일치하는 것을 찾을 수 있습니다. 연산자의 우선 순위와 결합 방향에 대해서는 올림피아드 기출문제로 배우는 C언어 - 연산자의 우선 순위와 결합 방향를 참고하세요.

결과적으로 문제의 수열에서 각 항은 값을 가지고 있고 각 항 간의 차이는 2n + 1의 항을 가지고 있는 { 3, 5, 7, 9, 11.... }와 같은 수열을 구성하게 됩니다. 실제 프로그래밍의 과정에서도 위의 문제 풀이처럼 샘플 데이터 두서너개를 로직에 대입해서 검증하는 과정을 꼭 거치는 것이 안정적인 프로그램을 작성하는 방법입니다.

위의 예제에서 while문을 다른 방식으로 기술하여 동일한 결과를 산출하는 방법이 있을 까요? i 변수 값에 따라 루프가 제어되는 구조이고 while문은 괄호 안의 식의 결과가 참(0이 아닌값)일 경우에 수행하므로 while ( i - 6)으로 기술해도 동일한 결과를 얻을 수 있습니다. 물론 실제로 이렇게 기술하는 방식은 프로그램의 가독성을 떨어뜨리지만 다른 이가 작성한 문장도 쉽게 읽을 수 있어야 하므로 while문에 대한 분명한 습득이 필요합니다. 

이미 작성되어 있는 프로그램을 분석하는 과정을 "프로그램을 읽는다"고도 하는 이 과정에서 전체적인 의도와 구조를 파악하는 것도 중요하지만 위의 문제를 푸는 과정 처럼 직접 부딪혀 보는 것은 너무도 중요한 과정입니다. 그런데 이 과정에서 실제로 프로그램이 실행되는 과정을 따라가지 못하면 다시 말해서 연산자의 우선 순위나 결합 방향, 문법등에 익숙하지 못하면 엉뚱한 프로그램 읽기가 될 수 있습니다. 기본기 익히기에 충실해야 하고, 실제 코드를 작성해서 실행해보고, 생각한 대로 프로그램이 동작하는지 변형해서 실험해보는 과정을 반복할 필요가 있습니다.

728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함