문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye

 
 1. 문제 해결 방법

 컴퓨터를 사용하여 문제를 해결하기 위해서는 이를 위한 프로그램을 작성하는 것이 필요하다. 따라서 컴퓨터를 사용한 문제 해결은 프로그램을 어떻게 작성할 것인가의 문제로 전환된다. 왜냐하면, 문제를 해결하는데 필요한 모든 세부 사항을 컴퓨터에게 알려주어야 하며, 이러한 세부사항들의 리스트가 곧 프로그램이기 때문이다.

여기서는 먼저 문제를 해결하는(프로그램을 개발하는) 소프트웨어 공학적인 한 방법을 설명한다. 이 방법은 모두 5단계로 구성한다

   

1. 문제의 요구사항을 정확히 명세한다.
2. 문제를 분석한다.
3. 문제를 해결하기 위한 알고리즘을 설계한다.
4. 알고리즘을 구현한다.
5. 완성된 프로그램을 테스트하고 검증한다.

     단계 1: 문제 요구사항 명세    
 

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye
이 단계에서는 문제를 완벽하고 애매모호함없이 정확하게 기술하고, 문제 해결이 무엇을 요구하는지에 관해서 명확하게 이해하는 것이 필요하다. 이 단계가 쉬워 보일지 모르지만 결코 그렇지 않다. 여러분은 문제를 정확하게 인식하고 정의할 수 있어야 한다.

 
     
     단계 2: 문제 분석    
 


이 단계에서는 문제의 입력과 출력을 식별하고, 문제 해결을 위한 추가 요구사항이나 제약사항을 고려한다. 또한, 입력 형태와 출력 형태를 정의하고, 프로그램에서 사용되는 변수를 정의하고, 변수들간의 관계를 기술한다.

 
     
     단계 3: 문제 설계    
 

이 단계에서는 문제를 해결하는 절차를 단계적으로 기술하고, 기술된 절차들이(이것을 알고리즘이라 한다) 문제를 해결하는지를 검증한다. 알고리즘(algorithm)을 작성하는 것이 문제 해결 과정에서 대부분 가장 중요하다.

알고리즘은 흔히 상향식 설계 방식(top-down design)에 따라 작성하는 것이 좋다. 이 설계 방식은 처음부터 문제의 모든 세부 사항을 해결하려고 하지말고, 문제를 단계적으로 상세화할 수 있게 한다.

즉, 처음에는 문제를 해결하는데 필요한 주요 단계만을 기술한다. 이러한 문제의 각 주요 단계를 부 문제(subproblem)라 한다.

다음에, 각 부 문제를 해결하고, 부 문제들을 통합하여 전체 문제를 해결한다. 만약에, 부 문제가 쉽게 해결 가능하지 않으면, 이러한 부 문제는 몇 개의 또 다른 부 문제들로 분할된다. 이러한 부 문제의 분할은 쉽게 해결 가능한 수준에 이를 때까지 단계적으로 계속된다.

대부분의 알고리즘은 다음 3개의 부 문제들로 구성된다

          알고리즘 1-1:
            1. 데이터를 읽어들인다.
               2. 계산을 수행한다.
               3. 결과를 출력한다.

알고리즘을 보다 알기 쉽게 다이어그램으로 나타낼 수 있다. 이러한 다이어그램을 순서도(또는 흐름도)(flow chart)라 한다. 위의 알고리즘을 다음과 같이 순서도로 표현할 수 있다.

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye
  < 순서도 1-1 >

위의 순서도에서 보듯이

평행사변형 노드 -->데이터의 입력과 출력

직사각형 노드 ----> 데이터의 처리를 나타내는데 사용된다.

이외에도 몇 가지 유형의 노드가 더 있지만, 여기서 모두 설명하지 않고 필요에 따라서 추가로 설명하겠다. 앞으로 문제를 설계하는데 알고리즘과 순서도를 필요에 따라서 선택하거나 혹은 둘다 사용할 것이다.

알고리즘 1-1에서 두 번째 단계가 대부분 가장 어려운 부 문제이고, 따라서 몇 개의 부 문제들로 다시 분할될 가능성이 크다. 첫 번째 단계에서는 데이터를 어떻게 읽어들일 것인지에 대해서 기술될 수 있고, 세 번째 단계에서는 결과를 어떻게 출력할 것인지에 대해서 기술될 수 있다.

문제를 부 문제들로 분할하고, 각 부 문제들을 해결하고, 해결된 부 문제들을 통합하는 방식으로 전체 문제를 해결하는 방식을 "분할과 정복(divide and conquer)"이라 한다.

 
     
     단계 4: 구현    
 
단계 3에서 설계되는 알고리즘은 특정 프로그래밍 언어와 무관하다. 이 단계에서는 여러분이 알고 있는 특정 프로그래밍 언어로 알고리즘을 다시 기술하는 것이다. 그 결과는 프로그램 그 자체이다.
알고리즘을 프로그래밍 언어로 작성하는 과정을 코딩(coding) 혹은 구현(implementation)이라 한다.
코딩은, 알고리즘 상에 기술된 각 단계(절차)를 선택한 프로그래밍 언어의 한 문장으로 변환하는 것으로 수행된다. 우리는 C 프로그래밍을 다루기 때문에, 코딩에 사용할 언어로 C 프로그래밍 언어를 선택한다.
따라서 알고리즘의 최종 버전에서 각 절차가 프로그래밍 언어의 한 문장으로 변환될 수 있는 수준에 이를 때까지 알고리즘을 단계적으로 세분화시키는 것이 필요하다.

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye

 
     
     단계 5: 프로그램의 테스트 및 검증    
 


단계 4에서 작성하여 완성시킨 프로그램이 여러분의 요구에 충족하도록 동작하는지를 검증하기 위하여 다양한 입력 데이터에 대해서 테스트한다. 입력 데이터에 대해서 프로그램 결과가 올바른지를 점검함으로써 프로그램의 올바름을 검증한다. 주의할 사항은 다양한 유형의 데이터에 대해서 프로그램의 동작 여부를 테스트해야 한다는 것이다.

 
     

여기서는 2.1절에서 다룬 문제 해결 방법을 적용하여 문제를 해결하는 과정을 설명한다. 아주 간단한 문제를 생각해보자

 
문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye
 단계 1 : 문제 요구사항 명세

문제가 간단하므로, 이 단계에서 고려할 사항이 없다고 생각할지 모르지만, 다음의 사항이 고려되어야 한다.

   

1. 두 개의 수가 정수인지 실수인지가 명확해야 한다.
2. 주어진 두 개의 수가 사용자로부터 입력받는지 그렇지 않은지를 분명히 해야 한다.

여기서는 두 개의 수가 정수이라고 가정한다. 그리고 문제를 더욱 간단히 하기 위해서 두 개의 수가 사용자로부터 입력되지 않는다고 가정한다. 즉, 두 개의 수는 특정 초기 값을 갖는다.

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye
단계 2 : 분석 이 문제에서 사용자로부터의 입력은 없다. 그러나 출력은 두 수를 덧셈한 결과 값이다.
이 단계에서 다음의 사항이 고려된다.

   


1. 두 개의 수와 덧셈 결과 값을 지칭할 이름을 정의한다.
   두 개의 수를 각각 a, b로 지칭하고, 결과 값을 r로 지칭한다.
   여기서 값들을 지칭하는 이름을 변수(variable)라 한다. 변수에 관해서는 2장에서 자세히 기술된다.

2. 변수들간의 관계를 기술한다.
   r이 두 수 a, b의 덧셈 결과 값을 나타내므로, 변수 a, b, r의 관계는 다음과 같이 나타낼 수 있다

r = a + b

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye
단계 3 : 설계

문제를 해결하는 절차를 다음의 알고리즘으로 기술한다.

   

    알고리즘 1-2:
     
 1. a, b, r을 선언하고, a, b에 초기 값을 설정한다.
        2. 두 개의 수를 더한다(r = a+b).
        3. 덧셈 결과 값(r)을 출력한다.

단계 1에서 사용할 이름(변수)들을 먼저 선언하고 있는데 이것은 보통 일반적이다. 변수 선언에 관해서는2주차 강의3장에서 자세히 설명한다. 위의 알고리즘을 다음과 같이 순서도로 나타낼 수 있다.

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye
  < 순서도 1-2 >

순서도 1-2를 알고리즘 1-2와 비교해 보라. 알고리즘 1-2의 단계1, 2가 순서도 1-2에서 차례대로 처리 노드로 표현되고, 단계 3이 출력 노드로 표현되는 것을 알 수 있다.

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye
단계 4 : 구현

구현 단계에서는 단계 3에서 설계된 알고리즘을 특정 프로그래밍 언어로 기술한다. 우리가 C 프로그래밍을 다루기 때문에 여기서는 C 프로그래밍 언어를 고려한다. 알고리즘 1-2를 다음과 같이 C 프로그램으로 작성한다

위의 프로그램은 간단한 C 프로그램을 보여준다. 이 프로그램은 전체 7줄로 구성되어 있는데, ①, ②, ③, ⑦은 대부분의 C 프로그램에 포함되는 항목이다.

따라서 C 프로그램의 가장 기본적인 구조는 다음과 같이 나타낼 수 있다.

 

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye

만약, 프로그램이 표준 입력이나 출력을 포함하지 않는다면, 첫 번째 문장#include <stdio.h>를 삭제할 수 있다.

알고리즘 1-2(순서도 1-2)의 세 단계가 각각 main 함수의 본체내 ④, ⑤, ⑥의 문장으로 기술되었음을 알 수 있다.

즉, 알고리즘의 각 단계가 C의 한 문장으로 기술되었다.

여러분은 이렇게 C 프로그램이 작성될 수 있도록 알고리즘을 기술하는 것이 매우 중요하다.

 

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye

다음은 main() 함수의 본체를 구성하는 세 문장에 대해서 간단히 설명한다.

는 알고리즘 1-2의 첫 번째 단계를 기술하는 것으로서, a, b, r의 세 개 변수를 선언하고, a, b의 변수에는 초기 값을 할당한다. 변수는 값을 지칭할 이름을 나타내는데, 실제로는 값이 저장되는 곳을 나타낸다.

변수 앞의 int는 이 변수에 저장될 수 있는 값의 타입(type)이 정수(integer)라는 것을 나타낸다. 즉, a, b, r은 정수 타입 변수로 선언되었으며, 이 변수에는 반드시 정수 값만이 저장되어야 한다.

다음은 ④ 문장의 실행 결과이다.

 

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye

는 알고리즘의 두 번째 단계를 기술하는 것으로서, a, b의 두 수 값을 더해서 그 결과를 r에 저장한다는 것을 나타낸다. 여기서 '='는 배정 연산자로서 오른쪽에 위치한 산술 식의 값을 계산하여 그 결과 값을 왼쪽에 위치한 변수에 저장한다. 다음은 ⑤ 문장의 실행 결과이다.

은 알고리즘의 세 번째 단계를 기술하는 것으로서, r의 값을 다음과 같이 출력한다:

printf 문에서 큰따옴표 안의 %d를 형식 코드(format code)라 한다.

큰따옴표 안에 형식 코드가 다음과 같이 여러 개 올 수 있다.

    printf("%d + %d = %d\n", a, b, r);

형식 코드들은 큰따옴표 다음에 오는 변수들의 값으로 순차적으로 대체된다.

 

문제해결과정 5단계 - munjehaegyeolgwajeong 5dangye

다음은 위 printf()문의 실행 결과를 보여준다.