CS; Computer Science(feat. David J. Malan)

TL;DR

네이버 부스트코스에 있는 Computer Science강의에 대한 개인적인 노트에 불과하니
정리내용이 조잡할 수 있음을 미리 알려드립니다😊

컴퓨터 과학이란 단지 문제를 해결하는 과정에 불과하다

여기서 문제를 해결하는 과정이란 어떠한 input이 있을 때 그로부터 어떠한 output을 도출해 내는 것
즉, 그 문제에 대한 답을 찾는 것이다

Computational Thinking, Scratch

2진법을 배워야 하는 이유는 기계들을 사용할 때 입력과 출력을 어떻게 표현할지에 대해 약속된 표현2진법이기 때문이다

우리에게 익숙한 것은 10진법인데 2진법도 그리 크게 다르지는 않다

12310진법으로는 100*1 + 10*2 + 1*3이라는 의미를 뜻하는 상형문자 혹은 기호이다
규칙성을 찾았는가? 1에서 10으로, 10에서 100으로 점점 10의 지수가 0에서부터 점점 늘어나고 있다

결국 진법이라는 글자 앞에 붙어있는 그 숫자의 지수와 각 자리수의 곱으로 이뤄져있다는 말이다

그렇다면 2진법에서의 123은 어떻게 표현될까? 정답은 1111011이다
일의 자리부터 20제곱, 십의 자리는 21제곱, ··· 이런식으로 곱해서 그 값들을 다 더하면 123가 나올 것이다

위에서 계속 언급된 OO의 자리자리를 우리는 컴퓨터에서는 bit라고 부르고 전구의 켜고 끔 같은 정보를 저장할 수 있다

bit가 8개가 모이면 byte가 되고 1byte00000000부터 11111111까지의 경우의 수를 가지므로 2^8의 경우의 수를 갖는다

위에서 언급한 전구의 켜고 끔같은 행위를 컴퓨터도 하는데 전구의 역할을 컴퓨터는 transistor에서 한고 이를 켜고 끔으로써 정보를 저장한다

컴퓨터에는 무수히 많은 transistor가 존재한다


이렇게하여 위와 같은 다양한 데이터들을 표현할 수 있게 된다

그 중에 문자를 숫자로 표현할 수 있도록 정해진 약속(표준)은 보통 설명미국정보교환표준부호 ASCII(아스키코드/American Standard Code for Information Interchange)를 따르는데

위와 같은 알파벳을 포함하여 총 128개의 부호로 정의되어 있다

하지만 ASCII로는 문자들을 표현하기에 충분하지 않기때문에 Unicode라는 표준에서는 더 많은 비트를 사용하여 더 다양한 다른 문자들도 표현가능 하도록 지원하고 있다

그렇다면 색은 어떻게 숫자로 필요할까? 아주 오래전 무지개와 같이 다양한 색들이 빨강, 파랑, 초록의 조합으로 이뤄져있다는 것을 밝혀냈고 그들의 이름을 따 RGB가 탄생한다
각 색의 단계를 0부터 255까지 총 256개의 단계로 나눠 세가지 색을 섞어서 원하는 색을 표현하는 것이다

예를들면 노란색은 RGB(72, 73, 33)이다

여기까지가 input에 대한 얘기였다면 이제 output에 대해 이야기를 해보자
그러려면 먼저 output을 어떻게 얻을 수 있는지에 대해 알아야한다

그 일련의 처리과정을 우리는 algorithm이라고 한다
즉, 알고리즘이란 입력값을 출력값의 형태로 바꾸기 위해 어떤 명령들이 수행되어야 하는지에 대한 규칙들의 순서적 나열이다

그러면 이 알고리즘은 어떤식으로 평가할까? 정확성이 있어야하는 건 당연하지만 정확성 못지않게 중요한 것이 효율성이다

예를들어 전화번호부에서 알고리즘이라는 사람의 번호를 찾을 때 우리는 처음의 부터 천천히 하나씩 읽어가는 방법이 있을 것이다
하지만 에서 으로 가는 길은 굉장히 길고 만약 길이가 1024라면 우리는 적어도 500번 이상의 지루한 작업을 반복해야 할 것이다

그렇다면 전화번호부가 오름차순으로 정렬되어 있다는 가정하에 좀 더 효율적인 방법은 무엇일까?
바로 문제를 나눠서 분할하여 정복하는 것이다

위에서의 예시처럼 길이가 1024이라면 반으로 나눠 512번째를 본다
여기서 이름이 벨로그라면 은 그 위에 있으므로 512번째까지 중에는 없다
그러면 이 512번째까지의 정보는 이제 우리에게 불필요하므로 버린다
그리고 나머지 513번부터 1024번 중에 또 적당히 반을 나눠 769번째를 본다
여기서 이름이 알파카가 나온다면 알고리즘은 이제 513번부터 769번째 사이에 존재하게 되므로 뒤에있는 770번째부터 1024번째까지의 정보를 버린다

이 과정을 반복하다보면 언젠가 알고리즘이라는 사람의 번호를 찾을 수 있게되고 부터 보던 방식에 비해서 효율성도 굉장히 상승했다

이러한 것을 프로그래밍 언어가 아닌 일반적인 언어로 코드를 흉내내어 작성하는 의사코드(pseudocode)로 작성해보면

1. 전화번호부를 집어든다
2. 전화번호부의 중간을 편다
3. 그 페이지를 본다
4. '만약' 그 페이지에 알고리즘이 있다면
	알고리즘에게 전화를 한다
5. '그렇지 않고' 알고리즘이 전화번호부 앞쪽(왼쪽)에 있다면
	전화번호부의 왼쪽 절반에서 중간을 편다
	3번으로 돌아가 그에 맞는 행동을 한다
6. '그렇지 않고' 알고리즘이 전화번호부 뒤쪽(오른쪽)에 있다면
	전화번호부의 오른쪽 절반에서 중간을 편다
	3번으로 돌아가 그에 맞는 행동을 한다
7. '그밖의 경우'(여기서는 알고리즘이 전화번호부에 없는 경우)에는 행동을 멈춘다

여기서 집어든다, 편다와 같은 동사를 우리는 컴퓨터에서 함수(function)이라고 부를 것이다
그리고 만약, 그렇지 않고, 그밖의 경우같은 것들을 컴퓨터에서 조건(condition)이라고 부를 것이다
이 조건에는 항상 결정을 내리기 위한 질문이 있다 예를들면 알고리즘이 전화번호부 앞쪽(왼쪽)에 있다면같은 것들이다
이러한 질문들을 우리는 불리언(boolean)이라고 부를 것이다
마지막으로 3번으로 돌아가 그에 맞는 행동을 한다와 같이 어딘가로 돌아가라는 문장을 우리는 루프(loop)라고 부를 것이다

알고리즘을 만들기 위해 여러가지 프로그래밍 언어를 사용할 수 있습니다
여기서는 MIT의 미디어 랩에서 만든 Scratch(스크래치)라는 그래픽 언어를 사용해보도록 하자
스크래치는 퍼즐 조각처럼 보이는 블럭들을 끌어 놓는 방식으로 연결시켜 컴퓨터가 무엇을 할지 단계적으로 프로그래밍할 수 있는 언어이다

먼저 스크래치 홈페이지에 접속해서 가입을 한 후 만들기를 누르면

위와 같은 화면을 볼 수 있을 것이다

오른쪽 위에 있는 초록깃발이 시작, 그 옆에 빨간 원이 정지버튼이다
블록들이 각각 잘 맞아 떨어지기만 하면 무엇을 만들던 제한은 없으며 본인이 적절한 것들을 왼쪽에서 끌어와서 사용하면 된다






reference
boostcourse: 모두를 위한 컴퓨터과학(CS50 2019)

좋은 웹페이지 즐겨찾기