이 강의는 네이버 부스트코스에서 제공하는 하버드 대학의 프로그래밍 기초 강의입니다.
: 문제 해결
에 대한 학문이다.
문제 해결
은 input을 받아 output을 만들어내는 것을 말한다.
이를 위해서는 input과 output을 표현하는 방법
에 대한 약속이 우선시되어야 한다.
컴퓨터에서 이를 표현하는 방법은 2진법
이다.
우리가 일상에서 사용하는 숫자 체계는 10진법이다.(0~9까지)
그러나 컴퓨터는 0과 1로만 데이터를 표현할 수 있고, 이와 같이 0과 1로만 표현하는 방법을 2진법
이라고 한다.
123이라는 숫자가 주어질때 우리는 자연스럽게 '백이십삼' 이라고 읽는다.
이렇게 인식하는 이유는 1을 백의 자리 숫자로 인식하고 2는 십의 자리, 3은 일의 자리로 인식하기 때문이다.
이를 식으로 표현하면 100 x 1 + 10 x 2 + 1 x 3
과 같다.
우리가 이렇게 받아들이는 이유는 각 자리 숫자를 10의 거듭제곱
로 나타내도록 약속했기 때문인데, 2진법에서는 이와 유사하게 각 자리 숫자를 2의 거듭제곱
로 나타낸다.
예를 들어 2진법에서 11이라는 숫자는 3을 의미한다.
첫 번째 자리는 1을 나타내고 두 번째 자리는 2를 나타내기 때문이다.(1+2)
또다른 예시로 2진법에서 1001은 숫자 9를 의미한다.(네 번째 자리 : 8, 첫 번째 자리 : 1)
2진법에서 하나의 자릿수를 표현하는 측정 단위를 비트라고 한다.
비트는 이진 숫자라는 뜻을 가진 binary digit
의 줄임말로, 0과 1만을 가질 수 있다.
(컴퓨터에는 트랜지스터라고 불리는 굉장히 많은 스위치가 있고, on/off 상태를 통해 0과 1을 표현한다.)
하나의 비트는 0과 1만을 저장할 수 있기 때문에 많은 양의 데이터를 나타내기에 부족하다.
여러 숫자 조합을 컴퓨터에 나타내기 위해서는 비트열
을 사용한다.
바이트
는 8개의 비트가 모여 만들어진 것이다.
각각의 비트는 2가지 값을 가질 수 있으므로 1바이트는 2^8 = 256비트이다.
킬로바이트는 1000바이트, 메가바이트는 1000킬로바이트, 기가바이트는 1000메가바이트, 테라바이트는 1000기가 바이트이다.
문자 또한 숫자로 표현할 수 있다.
예를 들어 A는 10진법 기준으로 65로 나타낼 수 있는데, 65는 64 + 1 이므로 2진법으로 나타내면 1000001이다.(B는 66, C는 67,,)
또 다른 예시로 72 73 33
는 hi!
를 의미한다.
이렇게 문자를 어떤 숫자로 표현 할 것인지를 정한 표준 중 하나가 ASCII
이다.
ASCII(아스키코드/American Standard Code for Information Interchange)는 정보 교환을 위한 미국 표준 코드로, 전 세계 사람들이 수십년 전에 동의한 약속이다.
ASCII로는 문자들을 표현하기에 충분하지 않았기 때문에 Unicode
라는 표준에서 더 다양한 문자들을 표현가능 하도록 지원하고 있다.
Unicode
에서는 😂 -> 요런 이모티콘들도 숫자로 표현할 수 있게 해주었다. 이 이모티콘은 10진법으로 128514이고, 이진법으로는 11111011000000010 이다.
그림 또한 숫자로 표현할 수 있다.
그림을 이루는 각각의 작은 점들을 픽셀이라고 부르는데, 픽셀은 RGB(Red, Green, Blue)로 이루어져 있다.
위에서 예시로 나왔던 72 73 33
를 RGB로 보면 각 색깔의 농도로 해석된다.
-> Red : 72, Green : 72, Blue : 33
이를 섞으면 실제로는 노란 색이 나온다.
영상은 수많은 그림을 이어붙인 것이기 때문에 마찬가지로 숫자로 표현이 가능하며, 음악도 각 음표를 숫자로 표현할 수 있다.
퀴즈 : CS50을 2진법으로 표현한다면?
C : 67 , S : 83, 50
67 = 64 + 2 + 1 ->1000011
83 = 64 + 16 + 2 + 1 ->1010011
50 = 32 + 16 + 2 ->110010
=> 답 :1000011 1010011 110010
알고리즘은 input에서 받은 자료를 output으로 만들기 위한 처리 과정
을 뜻한다.
예시로 전화번호부에서 Mike Smith를 찾는 알고리즘은 다음과 같다.
의사코드는 컴퓨터가 수행할 작업을 프로그램 언어가 아니라 사람이 사용하는 언어로 알고리즘의 논리적 절차를 작성한 코드를 말한다.
알고리즘을 짤 때 필요한 행동이나 조건을 의사코드로 나타낼 수 있다.
퀴즈 : 친구와 1부터 100까지 숫자 중 1가지 숫자를 맞추는 스무고개 게임을 하려고 합니다. 이 때 사용할 알고리즘을 의사코드로 표현하면 어떻게 될까요?
- 1 ~ 100까지 숫자 중 하나를 변수에 저장해둔다.
- 친구에게 받은 질문 갯수를 셀 변수를 만든다.
- 질문(숫자)을 입력으로 받아 설정해둔 답과 비교한다.
- 입력값과 답이 같은 경우 : '정답!'를 출력한다.
- 입력값과 답이 다른 경우 :
- 입력값이 답보다 크다면 'down'을 출력한다.
- 입력값이 답보다 작다면 'up'을 출력한다.
- count를 증가시킨다.
- count가 20보다 같거나 작은 경우 3번 과정을 반복한다.
- count가 20보다 커지면 '실패!'를 출력한다.
10은 8 + 2로 나타낼 수 있으며, 이를 2진법으로 나타내면 1010이다. 네 자리가 필요하므로 4비트가 필요하다.
512 / 2 / 2 / 2 = 64 이므로 3번이다.
14는 8 + 4 + 2로 나타낼 수 있으며, 이를 2진법으로 나타내면 1110이다.
8 + 2 + 1 = 11이다.
true로 바뀐다.