네이버 부스트코스에 있는 Computer Science
강의에 대한 개인적인 노트에 불과하니
정리내용이 조잡할 수 있음을 미리 알려드립니다😊
컴퓨터 과학이란 단지 문제를 해결하는 과정에 불과하다
여기서 문제를 해결하는 과정이란 어떠한 input
이 있을 때 그로부터 어떠한 output
을 도출해 내는 것
즉, 그 문제에 대한 답을 찾는 것이다
2진법
을 배워야 하는 이유는 기계들을 사용할 때 입력과 출력을 어떻게 표현할지에 대해 약속된 표현이 2진법
이기 때문이다
우리에게 익숙한 것은 10진법
인데 2진법
도 그리 크게 다르지는 않다
123
은 10진법
으로는 100*1 + 10*2 + 1*3
이라는 의미를 뜻하는 상형문자 혹은 기호이다
규칙성을 찾았는가? 1
에서 10
으로, 10
에서 100
으로 점점 10
의 지수가 0
에서부터 점점 늘어나고 있다
결국 진법
이라는 글자 앞에 붙어있는 그 숫자의 지수와 각 자리수의 곱으로 이뤄져있다는 말이다
그렇다면 2진법
에서의 123
은 어떻게 표현될까? 정답은 1111011
이다
일의 자리부터 2
의 0
제곱, 십의 자리는 2
의 1
제곱, ··· 이런식으로 곱해서 그 값들을 다 더하면 123
가 나올 것이다
위에서 계속 언급된 OO의 자리
의 자리
를 우리는 컴퓨터에서는 bit
라고 부르고 전구의 켜고 끔 같은 정보를 저장할 수 있다
bit
가 8개가 모이면 byte
가 되고 1byte
는 00000000
부터 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)