본문 바로가기

Today I Learned

21/09/19

모두를 위한 컴퓨터 과학 (CS50 2019) - 알고리즘, 메모리

 

7) 재귀

 

구글에 recursion을 검색하면...

다시 recursion을 찾으셨나요?하고 묻는 구글의 유머😅

 

재귀란 원래 있던 자리로 다시 돌아오는 것이다..

 

 

💬 중복 코드를 줄이기 위해서 반복문 대신에 재귀를 사용한다.

 

 

 

8) 병합 정렬

💬 강의 마지막에 나온 알고리즘의 실행 속도를 보면 알 수 있듯이 병합 정렬은 선택 정렬이나 버블 정렬보다 속도가 확연히 빠르다. 다만 O(n log n) 상한을 가지고 있고, 최선의 경우일 때도 Ω(n log n)이기 때문에 이미 자료가 정렬된 경우엔 시간과 메모리를 낭비할 수 있다.

 

 

 


1) 메모리 주소

  • 10진수와 비교하기 위해서 16진수를 표현할 때는 앞에 0x 를 붙여준다.
  • C언어에서 변수 앞에 & 연산자를 붙이면 변수의 메모리의 주소를 알 수 있다.
  • * 연산자를 사용하면 실제 값을 알 수 있다. 주소로 가달라는 뜻. *&n = n

 

💬CS50 을 16진수로 나타내보자.

A는 10진법으로 65. 그러므로 C는 67.

C : 67 = 2^6 + 2^1 + 2^0 = 1000011 = 100 0011 = 0x43

S : 83 = 2^6 + 2^4 + 2^1 + 2^0 = 1010011 = 101 0011 = 0x53

5 : 53 = 2^5 + 2^4 + 2^2 + 2^0 = 0110101 = 011 0101 = 0x35

0 : 48 = 2^5 + 2^4 = 0110000 = 011 0000 = 0x30

 

CS50 = 0x43533530

 

 

 

2) 포인터

int *p = &n;

앞 강의에서 배운 연산자가 포인터를 위한 것이었구나.

 

💬포인터의 크기는 메모리의 크기와는 상관없이 고정되어있고, 운영체제에 따라 다를 뿐이다.

 

 

 

3) 문자열

문자열의 주소는 첫번째 문자의 주소와 같다.

사실...

There is no string!

typedef char *string;

 

💬string 자료형을 사용하면 컴퓨터 메모리에 대한 이해가 없어도 직관적으로 코드를 파악할 수 있다.

 

 

 

4) 문자열 비교

💬두 문자열을 비교하는 코드

#include <stdio.h>
#include <cs50.h>

int main(void)
{
    string s = get_string("S : ");
    string t = get_string("T : ");
    
    if(*s == *t)
    {
    	printf("Same.\n");
    }
    else
    {
    	printf("Different.\n");
    }
}

 

 

 

5) 문자열 복사

💬메모리 할당 없이 문자열의 주소만 복사할 경우엔 원본이 훼손될 수 있다.

'Today I Learned' 카테고리의 다른 글

21/09/21  (0) 2021.09.21
21/09/20  (0) 2021.09.20
21/09/18  (0) 2021.09.18
21/09/16  (0) 2021.09.16
21/09/14  (0) 2021.09.14