[이산수학] 기초 개념 : 모델링, 추상화, 알고리즘 언어

준우·2022년 6월 5일
0

이산수학

목록 보기
1/2
post-thumbnail

이산수학이란?

미적분 등과 같이 연속적인 수학 구조에 대해 연구하는 연속 수학과 달리, 불연속적인 상태를 나타내는 이산적 수학구조에 대해 연구하는 수학의 한 분야이다. 일반적으로 디지털 컴퓨터가 다루는 데이터는 0과 1처럼 이산적인 값을 가지므로 이산수학은 디지털 컴퓨터가 데이터를 처리하는 과정에 필요한 수학적인 개념을 제공한다.

연속수학은 실수처럼 연속적인 특징을 가진 집합에 중점을 두며 '셀 수 없다'는 특징이 있는 반면, 이산수학은 자연수와 같이 딱딱 별개로 구분되는 집합에 집중한다. 이산수학은 유한하거나, '셀 수 있다'는 특징이 있다. 연속수학을 그래프로 표현하면 선의 형태로, 이산수학을 그래프로 표현하면 점의 형태로 확인할 수 있다. 또 컴퓨터 과학에서 처리하는 데이터가 연속적인 형태라면 아날로그 컴퓨터, 이산적인 형태라면 디지털 컴퓨터로 볼 수 있다. 아날로그 시계와 디지털 시계를 떠올리면 쉽다.

모델링과 추상화

수학적 모델링

*수학적인 도구, 기법, 방법론을 이용해 문제를 해결하려면 우선 실생활의 문제를 수학적 모델로 변화시켜야 하는데, 이런 과정을 수학적 모델링이라고 한다.

도구, 기법, 방법론 예시 (축구)

  • 도구 - 축구공, 축구화, 보호대, 유니폼, 축구장, 골대 등
  • 기법 - 킥, 헤딩, 트래핑, 스토핑, 태클 등
  • 방법론 - 누가, 언제, 어디서, 왜, 어떤 도구와 기법을 사용해야하는지에 대한 내용을 담은 개념의 집합

데이터 모델링

실생활의 문제를 컴퓨터의 영역으로 옮기는 과정을 데이터 모델링이라고 한다.

추상화

수학적 모델링이든, 데이터 모델링이든 추상화 과정을 거쳐야 한다. 문제의 해결을 위해서 필요한 핵심을 제외하고는 모두 제거하며 문제를 단순화 하는 것이다.

알고리즘 언어

사람이 일상 속에서 사용하는 자연어는 모호성이 있어 알고리즘을 표현하고 기술하기에 적절하지 않다. 그렇다면 알고리즘을 명확하게 표현할 수 있는 대안 중에는 어떤 것들이 있을까? 바로 다음의 세가지를 들 수 있다.

  • 컴퓨터 프로그래밍 언어
  • 순서도(flowchart)
  • 의사코드(pseudocode)

컴퓨터 프로그래밍 언어

Java, Python, C 언어 등 컴퓨터 프로그래밍에 사용하는 언어를 말한다.

장점

  • 컴퓨터의 작동을 기술한 언어이므로 컴퓨터를 이용한 문제 해결 방법 기술에 있어 가장 정확한 것으로 볼 수 있다.

단점

  • 컴퓨터를 작동하기 위한 동작을 세밀하게 지시하므로 알고리즘의 중요한 핵심요소가 잘 드러나지 않아 사람이 읽고 이해하기가 어렵다.
  • 알고리즘을 기술하는 동안 중요하지 않은 부차적인 표현(중괄호, 세미콜론 등)에 신경 써야 한다.
  • 통일된 프로그래밍 언어(Java, Python, C 등)가 존재하지 않는다.

순서도

장점

  • 알고리즘의 작동 방식을 도식화해서 전달할 수 있다.

단점

  • 제어 구조를 표현하는데 자유도가 너무 커서 알고리즘이 복잡해질 수록 알아보기 어려워질 수 있다.

의사코드

특정 프로그래밍 언어 문법에 따라 작성된 것이 아니라, 일반적인 언어로 프로그래밍 언어를 흉내내서 작성한 코드이다. 컴퓨터에서 실행되지않고 사람에게 알고리즘의 작동 방식을 설명하는 용도로만 사용된다.

장점

  • 구조적으로 모호한 부분은 프로그래밍 언어의 문법을 일부 차용해 명확히 기술하고, 구체적으로 표현할 필요가 없는 부분은 자연어를 사용해 설명식으로 기술하기때문에 사람이 이해하기 쉽다.

단점

  • 실제 프로그래밍 언어처럼 특별히 정해진 엄격한 규칙은 없어 다양한 변화구가 존재한다.

예시

할당문을 사용한 의사코드

x ⬅️ a+1;

변수x의 값에 a+1 을 대입한다.

순차문을 사용한 의사코드

x ⬅️ 0;
x ⬅️ x+1;
x ⬅️ x+2;

변수x의 값에 0을 대입한 뒤, x+1, x+2 를 순차적으로 대입한다.

if 조건문을 사용한 의사코드

if(x>0) print "pos";
else if (x<0) print "neg";
else print "zero";

x가 0보다 크면 "pos"를, 작으면 "neg"를 출력한다.

switch문을 사용한 의사코드

switch(x){
 case 0:
    print '0';
    break;
 case 1:
 	print '1';
 	break;
 default :
 	print 'please input 1 or 0';
    break;
}

x의 값에 따라 '0'과 '1' 또는 'please input 1 or 0' 문자열을 출력한다.

for문을 사용한 의사코드

for x ⬅️ 5 to 0
{
	print x;
}
print "finish";

5,4,3,2,1,0 을 차례대로 출력한 다음 finish 라는 단어를 출력한다.

while문을 사용한 의사코드

x ⬅️ 5;
while x >= 0 do
{
	print x;
    x ⬅️ x-1;
}
print "finish";

5,4,3,2,1,0 을 차례대로 출력한 다음 finish 라는 단어를 출력한다.

foreach을 사용한 의사코드

foreach x in {5,4,3,2,1,0}
{
	print x;
}
print "finish";

5,4,3,2,1,0 을 차례대로 출력한 다음 finish 라는 단어를 출력한다.

👼 Reference

  • 손진곤, 『이산수학』, 한국방송통신대학교출판문화원(2021), 제1장 이산수학의 개요

0개의 댓글