HOME 고객센터 공지사항
제목 컴퓨팅적 문제해결력이란?
등록날자 : 2017-11-09 / 조회수 : 208
첨부파일 :
게시글주소 : www.geniesoft.kr/board/board.asp?bType=V&bc_idx=1&Board_seq=3

2018년부터 소프트웨어 교육이 의무화된다. 아마도 4차 산업혁명에서 살아 남기 위한 몸부림일 것이다. 모두가 코딩교육에서 중요한 것은 컴퓨팅적 문제해결력을 기르는 것이라고 한다. 하지만 구체적으로 그것이 무엇인지, 무엇을 가르쳐야 컴퓨팅적 문제해결력을 길러줄 수 있는지 명쾌하게 답하는 사람이 없다.

이것에 대한 해답을 찾으려면 우선 컴퓨팅적 문제해결력이 무엇인지부터 알아야 할 것 같다. 컴퓨팅적 문제해결력이란 어떤 복잡한 문제를 컴퓨터의 빠른 연산력을 이용해 해결할 수 있는 능력을 말한다.

예를 들면, 평가원 모의고사 문제 중 다음과 같은 문제가 있었다.

“1부터 9까지의 숫자가 적힌 9장의 카드 중 3장을 뽑아 어떤 두 수도 연속되지 않게 크기순으로 나열하는 방법의 수를 구하여라”

위 문제를 학생들이 풀면 10명 중 8명은(나머지 2명은 여집합을 이용)다음과 같이 푼다.

앞 두 수를 1과 3으로 고정하고 세 번째 수를 5, 6, 7, 8, 9로 해서 5가지

즉 1 3 5, 1 3 6, 1 3 7, 1 3 8, 1 3 9와 같은 5가지를 말한다.

1과 4로 고정하면 4가지, 1과 5로 고정하면 3가지, 1과 6으로 고정하면 2가지, 1과 7로 고정하면 1가지로 맨 앞 수가 1로 시작하는 경우는 (1+2+3+4+5)가지가 생긴다.

맨 앞수가 2로 고정되면 (1+2+3+4)의 경우가 생기고, 맨 앞수를 3으로 고정하면 (1+2+3)으로 지금과 같은 규칙이면 총 경우의 수는 (1)+(1+2)+(1+2+3)+(1+2+3+4)+(1+2+3+4+5)=35가지로 답은 35가지이다.

위와 같은 논리로 코딩을 하면 3중 for문으로 해결할 것이다. 그러나 이런 코드는 변화하는 데이터와 복잡하게 들어오는 데이터를 해결할 수 없다.

만약 9장의 카드에서 4장을 뽑아 나열하라는 문제를 해결하려면 4중 for문으로 코드를 고쳐야 한다. 들어오는 데이터에 따라 코드를 항상 고쳐야 한다면 그 프로그램은 있으나 마나한 프로그램이다. 우리는 20장에서 6장을 뽑아 나열하든, 30장에서 10장을 뽑아 나열하든 그 경우들을 모두 구하는 코드를 짜야한다.

자 그러면 위 문제를 컴퓨팅적으로 해결해 보자. 유능한 알고리즘 설계자들은 다음 문구를 항상 마음속에 담아둔다. “어떤 복잡한 문제도 작은 단위로 쪼개면 해결할 수 있다.”

위의 문구를 마음에 새기고 문제를 먼저 기호화 하자.

f(n, k)를 1부터 n까지의 자연수가 적힌 n장의 카드 중 k장을 뽑아 어떤 두 수도 연속되지 않게 크기순으로 나열하는 경우의 수라고 정의하자.

그 다음 위 기호를 모듈화 하는데 다음과 같다. f(n, k)=f(n-2, k-1)+f(n-1, k)로 모듈화가 가능하다. 여기까지 생각해 냈으면 이미 문제는 해결된 것이다. 위 모듈만 자동화하여 반복처리하면 어떤 복잡한 데이터가 들어와도 쉽게 답이 나온다.

위 모의고사 문제를 적용해 보면 f(9, 3)=f(7, 2)+f(8, 3)을 반복처리 하는 것이다. 조금 설명하자면, f(9, 3)을 9가 쓰인 카드 입장에서 생각하면 세 번째에 자기 자신이 놓인 경우와 놓이지 않은 경우 두 가지로 구분할 수 있다. f(7, 2)는 세 번째에 9가 놓인 경우의 수이고, f(8, 3)은 세 번째에 9가 놓이지 않는 경우이다.

 
 
 

문제를 해결하는 과정은 복잡한 문제를 직관적으로 답이 나올 수 있는 수준까지 문제를 작은 단위로 쪼개 들어가는 방식이다.(Top-Down 방식임)

보기에 복잡해보이지만 컴퓨터는 엄청난 속도로 반복처리해 쉽게 답을 도출한다.

위 문제는 기호화와 모듈화만 했다면 재귀적으로도 해결할 수 있고(Top-Down 방식), 2차원 배열을 이용한 동적계획법(Bottom-Up 방식)으로도 해결할 수 있다.

위 문제는 코딩공부를 시작해 1~2년 정도 꾸준히 하면 해결할 수 있다. 어렵게 보이지만 우리 아이들은 습득력이 스폰지와 같아서 그 가능성이 무궁무진 하다. (어리다고 무시하면 안된다.)

결론적으로 컴퓨팅적 해결력이란 어떤 문제를 기호화(추상화)하고, 모듈화하는 능력이다. 모듈화까지 했다면 코딩하는 것은 별 거 아니다. 물론 기호화와 모듈화가 컴퓨팅적 문제해결력의 다는 아니지만 그 대표적인 한 예임은 분명하다. 그리고 대학입시 면접에서 면접관이나 기업채용  면접관은 위와 같은 수리사고력과 컴퓨팅적 문제해결력을 가장 중요한 평가 요소로 생각한다.

다음은 위 문제를 코딩한 코드이다.

#include

int F(int n, int k){

   if(k==1) return n;

   else if(n==(k*2-1)) return 1;

   else return F(n-2, k-1)+F(n-1, k);

}

int main(){

   int n, k;

   scanf("%d %d", &n, &k);

   printf("%d\n", F(n, k));

   return 0;

}

학교 교육에도 변화가 필요하다. 우리 아이들에게 수학, 과학문제를 적극적으로 활용하여 소프트웨어 교육을 가르치면 좋겠다. 수학선생님이 코딩을 배워 수학에 활용하고, 과학선생님이 코딩을 배워 과학에 활용하자. 그래야만, 자원이라고는 인재밖에 없는 우리나라에서 4차 산업혁명이 긴 불황에서 탈출하고 경제강국으로 가는 변곡점이 될 것이라 생각한다.

 



이전글 : 코딩수학 교재를 만들며..
다음글 : 홈페이지 동영상 강의 보는 방법