"오늘 모르는게 있으면 내일은 아는 내가 되자"
이 문구는 나의 가치관이자 항상 성장할 수 있게끔 해주는 원동력이라고 생각한다.
학창시절 신승범 선생님 수학 강의를 듣던 중 가장 와닿은 말이되었고, 현재까지 나의 가치관에 영향을 준 문구이다.
What ultimately matters in this course is not so much where you end up relative to your classmates but where you end up relative to yourself when you began
[중요한것은 당신이 반 친구들과 비교해서 어느정도 해냈는지가 아니라 처음 시작할 때의 여러분 자신과 비교하여 얼마나 성장했는가이다.]
강의를 시작하기 앞서 교수님께서 ppt에 이 문구를 띄우고 말하는데 내 가치관과 너무 흡사해서 가지고 왔다.
CS를 강의를 처음 듣는 학생들에게 전하는 교수님의 말씀이다.
대학교에서 전자과를 다니면서 트랜지스터를 배우고 C언어를 처음 배우면서 공부했던 개념들이 CS라는 이름으로서 제대로 다시한번 이해하게 되었다.
강의 중 흥미롭다고 느꼈던 부분은 여러개의 전구를 나란히 놓은채 학생들에게 직접 2진법을 쉽게 알려주는 부분이었다.
초등학생도 이해할만큼 재밌고 쉽게 접근할 수 있었다고 생각한다.
컴퓨터 과학은 문제 해결에 대한 학문이다.
input -> "컴퓨터 과학" -> output
이 "컴퓨터 과학"에 해당하는것이 0과 1로부터 시작해서 흔히 알고있는 알고리즘으로 귀결된다.
컴퓨터는 2진법, 0과 1을 사용한다
비트는 0과 1을 뜻한다.
수 백만, 수 천만 트랜지스터에 0 혹은 1에 대한 정보를 담아둔다.
컴퓨터는 수 많은 비트를 물리적(physically)으로 수행한다.
어떻게 많은 정보를 0과 1로 다룰 수 있을까?
컴퓨터가 문자, 사진 영상, 음악 등 다양한 정보를 0과 1이라는 두가지 전기신호로 어떻게 표현할 수 있을까?
우리가 눈에 보이는 문자들 모두를 2진수의 전기 신호로 약속을 해두었다.
그 약속의 기초가 되는것이 ASKII코드이다.
우리눈에 보이는 대부분의 문자 인코딩이 아스키에 기초를 두고 있다. 아스키는 영어를 바탕으로 약속된 것이고 인간의 언어는 영어만 있는것이아니라 다른 언어도 많다. 그래서 후에 널리쓰이고 있는게 유니코드이다.
그럼 이미지는 어떻게 표현할까?
이미지는 하나의 픽셀마다 RGB라는 세가지 정보를 담고있다.
[Red에 해당하는 2진수, Green에 해당하는 2진수, Blue에 해당하는 2진수]
해당 색의 정도를 표현하는 2진수들을 모두 합해 하나의 점으로 표시하고 이 점을 모으고 표현하게 되면 결국 이미지가 되는것이다.
그럼 영상은 어떻게 표현할까?
이 이미지를 연속해서 표현해주는것이 영상이 되는것이다.
알고리즘
컴퓨터에 정보를 어떻게 표현(입력)하는 법을 알게되었고 이제 이 정보를 컴퓨터는 어떻게 가공해서 출력하는 걸까?
컴퓨팅은 입력을 받아 그 입력을 처리한 후 출력하는 과정이다.
컴퓨터는 순서대로 필요한 동작을 하며 문제를 처리하는데 이것을 알고리즘이라고 한다.
강의에서 예시를 들어준것이 있다.
이름순으로 정렬된 전화번호부 책을 가지고 나와 "Mark ~"을 찾는 방법에 대해 설명해준다.
1. 전화번호부를 한장씩 넘기며 찾는다.
2. 전화번호부를 2장씩 넘기며 찾는다.
둘다 이름을 찾는데 문제가 없는 방법이다. 하지만 2번째 방법이 무려 두배의 속도를 낼 수 있을 것이다.
그치만 2번째 방법은 오류가 있다. 두장씩 넘기다보면 해당 이름을 건너 뛸 수도 있기 때문이다.
두번째 방법을 자세히 나열하면
1. 찾는 이름이 없으면 전화번호부를 2장씩 넘기고 확인한다.
2. 만약 현재 페이지에 찾는 이름이 있으면 멈춘다.
3. 그렇지 않은 경우 만약 찾는 이름이 포함되는 페이지를 넘어가지 않았으면 1번으로 돌아간다.
4. 찾은 이름이 포함되는 페이지를 넘어갔으면 한 페이지 전으로 넘기고 1번으로 돌아간다.
이것이 알고리즘이다.
알고리즘은 컴퓨터가 동작하는 순서를 나타낸다.
하지만 여기서 중요한 점 첫번째와 두번째 방법은 같은 방법이지만 한페이지가 아닌 두페이지씩 넘기면서 속도를 무려 2배나 향상시켰다.
알고리즘은 어떻게 짜느냐에 따라 "정확성", "속도", "효율성" 을 향상시킬수 있기때문에 알고리즘이 중요하다고 하는것이다.
여기서 더 좋은 알고리즘을 찾는다면 무엇일까?
책을 반씩 검색하는 것이다.
1. 책의 반으로 이동하고 찾는 이름이 있으면 수행을 멈춘다.
2. 책은 이름순으로 정렬되어 있기 때문에 해당이름이 어느쪽에 있는지 알수 있어 반을 버릴 수 있다.
3. 다시 1번을 수행합니다.
4. 한 페이지가 남을 때까지 계속 수행한다.
이 알고리즘이 효율적인지는 전화번호부 책의 페이지가 엄청나게 크게 늘어난다면 알 수 있다.
만약 100페이지짜리 책이라면 1번에 해당하는 알고리즘은 100번을 수행해야 할 수있다.
책이 200페이지라면 정확히 200번을 수행해야 할 수 있기때문에 효율이 두배 떨어진다.
하지만 세번째 알고리즘은 100페이지에서 수행한 결과보다 단 한번만 수행을 더 하면 되기때문이다.
이것이 알고리즘의 힘이다.
그래프를 보면 문제의 수가 늘어났을때 처리하는 속도의 차이를 느낄 수 있다.
알고리즘이 왜 중요한지 쉽게 배울 수 있는 좋은 강의였다.
'Development > CS' 카테고리의 다른 글
[CS50] 5강 메모리 (0) | 2021.12.23 |
---|---|
[CS50] 제 4강 알고리즘 (0) | 2021.12.20 |
[CS50] 제 3-2강 배열 (0) | 2021.12.20 |
[CS50] 제 3-1강 배열 (0) | 2021.12.19 |
[CS50] 제 2강 - C언어 (0) | 2021.12.18 |
댓글