컴퓨팅 사고 패턴인식 예시 - keompyuting sago paeteon-insig yesi

패턴 인식은 컴퓨팅 사고 4가지 구성 요소 중 하나입니다.

컴퓨팅 사고(Computational Thinking)의 4가지 구성요소

1. 분해(Decomposing)   2. 추상화(Abstraction)   3. 패턴인식(Pattern recognition)   4. 알고리즘(Algorithms)

컴퓨팅 사고 패턴인식 예시 - keompyuting sago paeteon-insig yesi

패턴인식이란

주어진 문제를 분해하기 위한 혹은 분해된 문제들의 유사성을 찾기 위한 과정.

유사한 문제들은 동일한 해결책 적용이 가능합니다.

완벽하게 동일한 모양의 공ㅌ통점을 파악하는 것도 중요하지만,

어느 정도 비슷한 모양의 공통점을 파악하는 것이 더 중요.

'유사한 패턴을 어느 범주까지 같은 패턴으로 인식할 것인가'


개인적으로 패턴인식은 정말 중요하다고 생각합니다.

일상에서 패턴을 인식하는 능력이 있으면 그것을 통해 서비스를 만들 수 있기 때문입니다.

예시로 매일 똑같은 루트의 대중교통을 이용하는 것도 하나의 패턴입니다.

이런 패턴을 빠르게 인식하고 편리한 서비스로 만들어서 이익을 창출하고 있습니다.

컴퓨팅 사고 패턴인식 예시 - keompyuting sago paeteon-insig yesi

Chapter 07  |  컴퓨팅 사고와 알고리즘

01 컴퓨팅 사고의 이해

1. 컴퓨팅 사고의 개념

컴퓨팅 사고(Computational Thinking, CT)란?

  문제를 해결하려고 논리적이고 창의적으로 생각하는 것.

  컴퓨터(사람이나 기계)가 효과적으로 수행할 수 있도록 문제를 정의하고 그에 대한 답을 기술하는 것이 포함된 사고 과정 일체를 일컫는다.

  컴퓨터를 이용하여 문제를 해결할 수 있는 논리적이고 창의적인 생각 방식

2. 컴퓨팅 사고의 사례

▶ 2진수

   보통 계산기를 만들 때 10진수를 입력받아 10진수의 사칙연산을 구현할 수 있는 회로를 만들고, 그 결과를 10진수로 보여주는 방법을 생각할 것이다. 하지만 10진수의 사칙연산을 회로로 구성하는 것은 매우 어렵다. 그대신 10진수를 2진수로 바꾸고, 2진수로 사칙연산을 한 후 결과만 10진수로 보여주는 계산기 회로를 구성하는것이 훨 간단하다.

컴퓨터가 계산을 빠르게 할 수 있도록 2진수를 사용하는 것이다.

▶ 입출력 채널의 분리

   음식이 빨리 나오는 패스트푸드와 천천히나오는 한식의 줄을 한줄로 세운다면 패스트푸드를 기다리는 사람이 시간 낭비를 하게 된다. 이 줄을 분리하면 패스트푸드를 기다리는 사람의 시간 낭비를 줄일 수 있다.

입출력 장치를 느린 채널과 빠른 채널로 분리하여 사용하면 전체 입출력의 효율은 올라간다.

▶ 버퍼

  버퍼는 속도 차이가 많이 나는 두 장치 사이에 끼어서 속도 차이를 완화해 주는 장치이다. 

토마토주스 공장에서 토마토를 매우 빠른 속도로 가는 기계가 있다. 이러한 기계에 토마토를 하나씩 옮겨 넣는 다면 이는 매우 비효율적이므로 기계 속도에 맞추려면 토마토를 큰 바구니에 담아 한꺼번에 옮겨야 한다. 여기서 큰 바구니가 버퍼 역할을 한다.

▶ 캐시

    캐시는 앞으로 사용이 예상되어 미리 가져다 놓는 것을 말한다.

대용량으로 포장된 조미료를 요리할 때마다 덜어 쓰는 것은 매우 불편하다. 그래서 주방에는 조미료를 조금씩 덜어 놓은 조미료통이 있다. 조미료통이 캐시 역할을 하는 것이다.

▶ 병렬 처리

    병렬 처리는 작업 2개를 동시에 처리하는 기법이다. 어느 중국집의 주문이 밀려 음식을 맛보려면 30분을 기다려야한다. 중국집 주인은 주방장을 더 채용하고 주방을 하나더 만들어 15분 정도면 음식을 완성할 수 있게 만들었다. 이것이 바로 병렬 처리이다.

병렬 처리를 하려고 CPU에 코어를 2개 만들었는데, 이러한 CPU를 듀얼코어(dual-core)라고 한다.

02 컴퓨팅 사고의 구성

컴퓨팅 사고는 추상화, 분해, 패턴 인식, 알고리즘으로 구성된다.

1. 추상화 abstraction

    문제에서 중요하지 않은 부분을 제거하고 중요한 특징만으로 문제를 구성함으로써 문제 해결을 좀 더 쉽게 하는 과정

세부 사항을 제거하여 간결하게 만드는 것으로 문제 본질을 쉽게 파악할 수 있다. ex) 지도, 지하철 노선도, 네온사인

추상화로 공통의 특성을 추려 내어 만든 개념을 일반화라고 한다. 일반화는 어떤 특징을 가지고 만든 개념을 의미한다.

2. 분해 decomposition

    추상화한 문제를 해결하기 쉬운 작은 단위의 문제로 나누는 과정

복잡한 문제를 풀기 쉬운 간단한 문제로 나누는 것이다. 예를 들면 짜장면 만들기를 짜장만들기, 면 삶기 또, 고기 볶기, 양파 볶기, 짜장 넣기, 물 끓이기, 면 넣기, 면 헹구기로 나눌 수 있다. 이렇게 큰 문제를 작은 문제 여러 개로 나누는 작업이 분해다.

해결된 작은 문제를 결합하여 큰 문제를 해결하는 방식을 분해 정복(divide and conquer)이라고 한다. ex) 이진 탐색

3. 패턴 인식 pattern recognition

    추상화 및 분해를 한 후 데이터를 특징별로 나누어 유사한 문제 해결 방식이 있는지 찾아보는 과정

    우리가 해결하는 문제 혹은 데이터에서 의미 있는 패턴을 찾아내는 과정

패턴은 동일한 것이 반복된다. 복잡한 문제를 분해하는 과정에서 유사한 특성을 발견할 수 있을 것이다. 컴퓨팅 사고에서 패턴 인식은 문제에 적용 가능한 패턴을 찾아내는 과정이다. 패턴을 찾을 수 잇다면 문제를 해결하기 매우 쉽다.

RGB는 빛의 패턴이다. 패턴을 인식했다면 색을 만드는 방법도 알 수 있다. (255, 255, 255)면 흰색이고, (0, 0, 0)이면 검은색이다. RGB 조합에 따라 16만 가지 이상의 색을 만들 수 있다.

4. 알고리즘 algorithm

    어떤 문제를 해결하는 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것

추상화, 분해, 패턴 인식으로 문제를 해결하는 방법을 찾았다면 이를 알고리즘으로 만들어야 한다. 알고리즘을 컴퓨터가 이해할 수 있는 언어로 변환한 것이 프로그래밍 언어다. 우리는 프로그래밍 언어를 사용하여 문제를 어떻게 해결할 것인지 컴퓨터에 명령한다. 이렇게 만든 명령 집합이 프로세스다. 

03 알고리즘의 이해

1. 알고리즘의 개념

알고리즘이란?

  주어진 문제를 어떻게 해결할지 그 방법과 절차를 기술한 것으로 요리에 비유하면 레시피와 같다. 

  어떤 자료를 가공하여 특정한 정보를 만드는 절차이다.

2. 알고리즘의 표현 방법

알고리즘은 자연어를 사용하거나, 순서도를 사용하거나, 의사코드를 사용하거나, 프로그래밍 언어를 사용하여 표현한다. 

▶ 자연어 natural language

    사람들이 일상생활에서 쓰는 언어로, 컴퓨터가 사용하는 프로그래밍 언어와 구별된다. 전체 알고리즘 구조를 파악하려면 모든 문장을 읽어야 하기 때문에 자연어로 알고리즘을 표현하는 것은 매우 복잡하다.

▶ 순서도 flow chart

    전체 구조 흐름을 파악하는 데 많이 사용하는 것이다. 약속된 기호와 선을 사용하여 문제 해결 과정을 표현하는 방법이다. 

컴퓨팅 사고 패턴인식 예시 - keompyuting sago paeteon-insig yesi
순서도 기호

순서도는 알고리즘 흐름을 빠르게 파악할 수 있다는 장점이 있지만, 복잡한 프로그램을 순서도로 작성하기 까다롭다는 단점이 있다.

▶ 의사코드 pseudo code

    알고리즘을 표현하는 가장 간단한 방법은 의사코드를 사용하는 것이다. 프로그래밍 언어와 유사한 서술로 알고리즘을 표현한 것으로, 프로그래밍 언어를 흉내 낸 것이다. 프로그래밍 언어와 구조가 유사하지만, 특정한 프로그래밍 언어의 문법을 따르지 않기 때문에 가짜 코드라는 의미로 의사코드라고 한다.

▶ 프로그래밍 언어 programming language

    의사코드를 작성하면 특정한 프로그래밍 언어로 쉽게 변환할 수 있다.   

>> 05 프로그래밍 언어에서 자세히 다룸

3. 알고리즘 조건

  • 입력 : 알고리즘에 입력되는 자료가 0개 이상 존재한다.
  • 출력 : 알고리즘이 실행되면 결과 값이 1개 이상 나온다.
  • 유한성 : 알고리즘은 종료되어야 한다.
  • 명확성 : 알고리즘의 명령이 모호하지 않고 명확해야 한다.
  • 수행 가능성 : 알고리즘의 명령은 수행 가능해야 한다.

4. 알고리즘 설계

문제를 해결하는 가장 효율적인 방법을 찾아내는 과정을 의미한다.

먼저 문제의 현재 상태와 목표 상태를 명확희 정의해야 한다. 두 상태를 정확히 인지해야 현재 상태에서 목표 상태로 도달하려면 어떤 작업을 수행해야 하는지 그 종류와 순서를 파악할 수 있기 때문이다.

▶ 순차 구조 

    어떤 일을 처리하는 데 필요한 과정을 시간적인 순서에 따라 순차적으로 나타낸 구조다. 보통 위에서 아래로 하나씩 실행된다.

▶ 선택 구조 

    특정 조건을 만족하는지 아닌지에 따라 다음 명령을 선택적으로 실행하는 구조다.

▶ 반복 구조

    어떤 문제를 해결하려고 동일한 동작을 반복적으로 실행하는 구조다.

5. 알고리즘 분석

하나의 문제 상황을 해결하는 알고리즘은 다양하게 나타날 수 있는데, 이때 각 알고리즘을 비교하고 분석하는 과정에서 가장 효율적인 알고리즘을 선택하는 것이 중요하다. 효율 적인 알고리즘을 판단하는 기준에는 여러가지가 있다. 프로그램을 실행하여 결과가 나올 때까지 실행 시간이 짧고 기억 장소를 적게 사용하는 것을 효율적인 알고리즘이라고 한다. 

알고리즘의 성능을 분석하는 방법에는 알고리즘을 구현한 프로그램을 직접 실행시키는 방법과 알고리즘의 실행 횟수 등을 분석하는 복잡도 분석 방법이 있다.

알고리즘의 복잡도란?

해당 알고리즘이 특정 기준에 따라 얼마나 빠르게 또는 느리게 실행되는지 나타내는 것이다.

▶ 시간 복잡도

    알고리즘이 실행되어 종료될 때까지 어느 정도의 시간이 필요한지 측정하는 방법

실제 컴퓨터의 실행시간을 측정하기는 어렵기 때문에 시간 복잡도는 알고리즘의 중요한 코드가 몇 번 실행되는지를 분석한다. 시간 복잡도의 차이는 처리할 데이터의 양이 많을수록 더 확실하게 구분할 수 있다.

▶ 공간 복잡도

    알고리즘이 문제를 해결하는 데 어느 정도의 저장 공간이 필요한지를 측정하는 방법으로 기억 장치 내의 공간을 얼마나 적게 사용하는지가 중요. 이때 저장 공간은 알고리즘이 사용하는 공간과 알고리즘에 입력되어 처리하는 자료 공간을 모두 포함한다.

04 알고리즘을 이용한 문제 해결

1. 알고리즘 설계 실습 : 스무고개

--SKIP--

2. 알고리즘을 이용한 문제 해결 과정

1) 코드 작성

    주어진 문제로 알고리즘을 짠다. 글을 쓰듯이 간단히 서술해도 되고 의사코드 형태로 만들어도 된다. 의사코드를 작성했으면, 자신이 잘 다룰 수 있는 프로그래밍 언어로 바꾼다.

2) 코드 검토

    코드를 작성하면 그 코드를 머릿속에서 돌려 본다. 마치 내가 컴퓨터가 되어 한 라인씩 실행해 보는 것이다. 이 과정은 매우 중요하다. 내 머릿속에서 돌아가는 코드여야 컴퓨터에서도 작동될 것이기 때문이다. 초기 단계에서는 검토하는 과정을 꼭 거치는 것이 좋다.

3) 입력 및 실행

    코드를 검토한 후 문제가 없다고 판단했으면 마지막으로 프로그래밍 언어로 입력하여 실행한다. 이 단계에서는 자신이 푼 문제가 맞았는지 확인한다. 프로그램을 실행했는데 오류가 발생한다면 '코드 작성'단계로 돌아가 코드를 수정해야 한다. 문법 오류는 오류 종류를 파악하여 입력 창에서 수정하면 된다.

    코드 오류는 '버그 bug'라고 하며, 버그를 없애는 과정을 디버깅 debugging이라고 한다. 디버깅으로 자신이 실수한 부분을 찾아내어 '코드 작성', '코드 검토', '입력 및 실행'단계를 반복한다.

05 프로그래밍 언어

1. 프로그래밍 언어 소개

프로그래밍 언어는 컴퓨터에 작업을 지시하는 데 사용하는 언어다.

컴퓨터 언어에는 기계어, 어셈블리어, C, C++, 자바, 파이썬 처럼 다양하다.

2. 저급 언어와 고급 언어

◆ 저급 언어 low level language

  기계어에 가깝지만 사람이 이해하기 힘든 언어

  ▶ 기계어 machine language

    컴퓨터가 이해하는 언어로 숫자로만 구성되어 있다. 기계는 알아들을 수 있으나 일반인은 이해할 수 없다. 

  ▶ 어셈블리어 assembly language

    기계어를 사람이 이해할 수 있는 문자 형태로 바꾸어 놓은 것이다. 숫자를 문자로 바꾸기만 했기에 여전히 이해하기 어렵다. 

◆ 고급 언어 high level language

  사람이 사용하는 단어를 사용해 이해하기 쉽게 만든 언어

  ▶ C 언어

    유닉스 운영체제를 만들 때 사용한 언어로, 간단하면서도 어셈블리어 같은 저급 언어의 기능도 있는 강력한 언어다. 강력한 대신 일반인이 배우기는 좀 까다로운 측면이 있다. 그럼에도 유닉스 운영체제의 커널을 살펴보려면 C 언어를 알아야 하기 때문에 컴퓨터 관련 학과에서는 전통적으로 C언어를 가르친다.

3. 객체 지향 언어 object oriented language

C 언어를 객체 지향 언어로 바꾼 것이 C++ 언어다.

  일반 언어에서 데이터를 담는 통을 변수 variable라고 한다. 변수에 간장이 담겨 있다고 상상해 보자.  이 간장을 3cc 덜어서 국에 넣으려 할때 일반 언어 방식은 계량 숟가락을 사용하여 3cc를 맞춘 후 국그릇에 넣는다. 객체 지향 언어에서는 변수를 담는 통에 펌프가 달려 있으며, 펌프를 누르면 간장 1cc가 나온다. 따라서 계량 숟가락을 사용할 필요 없이 펌프를 세번만 눌러주면 된다.

  일반 언어는 데이터(통)와 이를 처리하는 함수(계량숟가락)를 따로 관리한다. 그러다보니 사용자가 직접 계량해서 맞추어야 하므로 실수로 간장을 엎지르기도 한다. 

  객체 지향 언어는 데이터를 담는 통과 통에 담긴 데이터를 처리할 수 있는 함수(메소드)를 하나로 묶어 놓은 것이다. 변수와 함수를 하나로 묶어 객체로 처리하면 분리해서 사용할 때보다 편리하게 데이터를 처리할 수 있는 장점이 있다. 객체 지향 언어에는 다른 객체의 상속이나 데이터를 사용할 수 있는 사람과 데이터를 사용할 수 없는 사람을 구분하는 것 같은 추가 기능도 있다.

  객체 지향 언어 중 현재 가장 많이 사용하는 것은 자바 Java다. 자바 언어를 많이 사용하게 된 이유가 조금 독특하다. C 언어의 단점은 유닉스에서 C 언어로 만든 코드가 윈도우 운영체제에서는 작동하지 않는 것이다. 따라서 유닉스에서 만든 C 언어 코드를 윈도우에 맞게 수정해야 한다. 더 큰 문제는 유닉스도 버전이 다양해서 유닉스 운영체제끼리 호환하지 않는 경우다. 이렇게 호환성이 떨어진다는 것은 개발자 입장에서 아주 골치 아픈 일이다. 응용 프로그램을 만들 때 각각 다로 만들어야 하기 때문이다.

  이러한 호환성 문제를 해결한 언어가 바로 자바다. 자바로 프로그래밍하면 대부분의 운영체제에서 작동하기 때문에 코드를 수정할 필요가 없다. 자바가 작동하는 원리는 매우 간단하다. 운영체제 위의 가상머신 virtual machine을 만들고, 그 위에서 응용 프로그램이 작동하게 하는 것이다.

  가상머신은 운영체제와 응용 프로그램 사이에서 작동하는 프로그램으로, 가상 머신을 설치하면 응용 프로그램이 모두 동일한 환경에서 작동하는 것처럼 보인다. 따라서 하나의 코드만 만들면 여러 운영체제에서 똑같이 실행할 수 있다. 자바는 유닉스와 윈도우에서 작동하는 다양한 가상머신을 만들어 배포하는데, 이를 자바 가상머신 Java Virtual Machine, JVM이라고 한다. 자바로 만들어진 프로그램을 사용하기 위해서는 자신의 운영체제에 맞는 JVM을 설치하면 된다.

  앞서 언급한 언어 이외에 문법을 단순화하여 일반인이 쉽게 이해할 수 있도록 만든 언어가 파이썬 python이다.

4. 컴파일러와 인터프리터

우리가 알기 쉽게 만든 언어를 고급 언어라고 하며, 고급 언어로 짠 코드를 소스코드라고 한다. 우리는 고급 언어가 더 편하지만 컴퓨터는 기계어만 인식한다. 따라서 우리가 만든 소스코드를 기계어로 번역하는 작업이 필요하다. 대표적인 언어 번역 방식으로 컴파일러와 인터프리터가 있다.

▶ 컴파일러 compiler

    소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역하여 실행 파일을 만든 후 한꺼번에 실행한다. C언어 자바 등

 ☞ 컴파일러 사용 목적

   1) 소스코드에서 오류를 발견하여 실행할 때 문제가 없도록 하는 것

   2) 최적화

결론적으로 컴파일러는 실행하기 전에 코드를 점검하여 오류를 수정하고 최적화해서 작고 빠른 실행 파일을 만든다.

▶ 인터프리터 interpreter

    소스코드를 한 번에 한 행씩 번역하여 실행한다. 자바스크립트 베이직 등

    한 줄씩 위에서 아래로 실행하기 때문에 같은 일을 반복하는 경우나 필요 없는 변수를 확인할 수 없다. 따라서 크고 복잡한 프로그램에는 컴파일러를 사용하고, 간단한 프로그램에는 인터프리터를 사용한다.

** 자바(=컴파일러)   vs   자바스크립트(=인터프리터)

  자바는 주로 대형 프로그램에 사용하며 컴파일 과정에서 최적화된 실행 파일을 만들며, 이 실행 파일을 실행하여 겨로가를 얻는다. 변수를 선언해야 하고 컴파일 후 실해오디고 오류 찾기와 코드 최적화, 분할 컴파일을 사용하여 공동작업이 가능하다.

  자바스크립트는 웹 프로그램 같은 간단한 프로그램을 작성하거나 데이터베이스를 다른 응용 프로그램과 연결하는 코드를 작성할 때 사용한다. 변수를 선언할 필요가 없고 한 줄씩 실행되고 실행이 편리하다.

초연결 사회를 위한 컴퓨터 개론 정리

-끝-