Computer Science 40

[CS50] 메모리 교환, 스택, 힙

오늘은 메모리에 이미 저장된 값을 교환할 때 어떤 방식으로 교환해야 하는지에 대해 공부해보도록 하겠습니다. 가장 먼저 swap이라는 함수를 따로 만들어서 입력받은 정수 a, b를 교환하는 작업을 해보도록 하겠습니다. #include void swap(int a, int b); int main(void) { int x = 1; int y = 2; printf("x 는 %i, y 는 %i\n", x, y); swap(x, y); printf("x 는 %i, y 는 %i\n", x, y); } void swap(int a, int b) { int tmp = a; a = b; b = tmp; } 위의 코드처럼 x, y에 각각 정수를 입력하고 swap 함수를 사용해 바꿔봤습니다. 결과가 어떻게 나올까요?? 분명히..

CS 기초/메모리 2021.08.24

[CS50] 문자열 복사

지난 포스팅에서 문자열이 메모리에 어떤 방식으로 저장되어있는지, 또 어떻게 불러오고 비교하는지에 대해 공부해봤습니다. 그렇다면 문자열을 다른 곳에 복사할 때는 어떤 방법을 써야 하는지 공부해보도록 하겠습니다. 아래와 같이 문자열이 어떻게 복사가 되는지 보기위해 아래와 같이 문자열을 복사해서 첫 문자를 대문자로 바꾸는 코드를 작성해 보겠습니다. #include #include #include int main(void) { string s = get_string("s: "); string t = s; t[0] = toupper(t[0]); printf("s: %s\n", s); printf("t: %s\n", t); } 처음 입력은 emma로 전부 소문자로 입력한뒤 결과를 봤는데 t뿐 아니라 s까지도 대문자..

CS 기초/메모리 2021.08.22

[CS50] 문자열 비교

오늘은 문자열이 두 개일 때 같은 내용을 담고 있는지?, 또 이 두 개가 직접적으로 비교가 가능한지에 대해 공부해보도록 하겠습니다. 지난 포스팅에서 문자열은 각 문자의 배열이고 각 문자는 메모리에 서로 다른 주소 값을 가지고 있다는 것을 공부했습니다. 실제로 확인해보면 #include int main(void) { char *s = "EMMA"; printf("%p\n", &s[0]); printf("%p\n", &s[1]); printf("%p\n", &s[2]); printf("%p\n", &s[3]); } 이렇게 코드를 작성하고 실행했을 때 주소값이 다르게 출력되는 것을 확인할 수 있습니다. ** 여기서 주소값을 보면 첫 번째 문자인 "E"를 시작으로 메모리상에 바로 옆에 저장되어있는 것을 볼 수 ..

CS 기초/메모리 2021.08.21

[CS50] 문자열

지금까지 문자열을 string이라는 자료형을 사용해 저장해왔습니다. 그런데 C에는 string이 실제로 존재하지 않는 자료형이라고 합니다. 그렇다면 문자열이 실제로 메모리상에 어떻게 저장되어있는지, 저장되어있는 문자열에 어떻게 접근해야 하는지 공부해보도록 하겠습니다. 지금까지 배우면서 문자열을 변수에 저장하기 위해 CS50 라이브러리에 있는 string 자료형을 사용해왔습니다. 예전부터 문자열은 문자의 배열이라고 배웠는데 만약 string s = "EMMA"; 라는 코드가 있다면 그림과 같이 s[0], s[1], ... 처럼 하나의 문자가 배열의 한 부분을 차지하고 마지막엔 \0인 null 종단 문자로 문자열의 끝을 나타내 줬습니다. 그렇다면 문자열의 주소는 어떻게 가리키게 될까요?? 위의 변수 s는 이..

CS 기초/메모리 2021.08.20

[CS50] 포인터

지난 포스팅에서 메모리 주소를 설명하면서 '&'연산자와 '*'연산자를 사용할 때 포인터라는 개념이 나왔는데 오늘은 이 포인터에 대해 공부해보도록 하겠습니다. 다시 한번 설명하자면 '*'연산자는 어떤 메모리 주소에 있는 실제값을 받아오게 해주는 기능을 합니다. 이 연산자를 이용해서 아래와 같이 포인터 역할을 하는 변수 선언도 가능합니다. #include int main(void) { int n = 50; int *p = &n; printf("%p\n", p); printf("%i\n", *p); } 결과는 어떻게 나올까요? 위 코드를 보면 int형 변수 n에는 50이라는 값이 저장되어있습니다. 그리고 *p라는 포인터 변수에 &n이라는 변수 n의 주소를 저장합니다. 그래서 int *p는 *이 이 변수가 포인..

CS 기초/메모리 2021.08.19

[CS50] 메모리 주소

오늘부터는 메모리와 관련해서 공부해보도록 하겠습니다. 오늘은 예전에 문자열과 배열에서 잠깐 다룬 적 있었는데 참조하실분들은 참고해주세요~ https://darmk.tistory.com/entry/CS50-%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC-%EB%B0%B0%EC%97%B4?category=966397 [CS50] 문자열과 배열 C뿐 아니라 많은 프로그래밍 언어들은 문자열을 저장하기 위해 string 자료형을 사용했습니다. 문자열이라는 단어는 문자가 나열되어있다. 즉 배열되어있다.라는 의미로 추측해볼 수 있는데요. darmk.tistory.com 실제로 코딩할때 작성하는 변수들은 컴퓨터 메모리에 어떤 방식으로 저장되는지 그리고 그 저장된 변수의 메모리 주소를 나타내는 방법과 ..

CS 기초/메모리 2021.08.18

[CS50] 재귀

알고리즘을 구현하기 위해서 코드를 작성하다 보면 동일한 작업을 반복해야 할 때가 있는데 이런 작업을 함수로 구현하면 코드를 보다 효율적으로 만들 수 있었습니다. 하지만 함수 내에서도 동일한 작업이 반복되는 경우는 어떨까요? 오늘은 함수를 재귀적으로 호출하는 방법에 대해 공부해보도록 하겠습니다. 재귀란? 어떠한 것을 정의할 때 자기자신을 참조하는 것을 뜻한다.(출처 : 위키백과) 지금까지 main함수에서 함수를 호출해서 코드를 실행했었습니다. 이것을 다르게 말하면 함수 안에서 또 다른 함수를 사용할 수 있다 라는 말인데 그렇다면 함수가 본인 스스로를 호출해서 사용할 수도 있다는 말이 되고 이를 재귀라고 합니다. 지금까지는 아래와 같은 피라미드 모양을 출력하기 위해서 # ## ### #### #include..

[CS50] 정렬 알고리즘의 실행시간

지금까지 정렬 알고리즘이나 검색 알고리즘을 공부하면서 실행 시간의 상한과 하한도 함께 배워봤습니다. 오늘은 각각의 실행시간을 비교해보면서 그 시간을 단축시킬 수 있는 방법이 있는지에 대해 공부해보도록 하겠습니다. 지금까지 선형 검색(탐색), 이진 검색(탐색), 버블 정렬, 선택 정렬의 실행시간을 Big-O와 Big-Ω로 나눠보면 - 실행시간의 상한 O(n^2) : 선택 정렬, 버블 정렬 O(n log n) O(n) : 선형 검색 O(log n) : 이진 검색 O(1) - 실행시간의 하한 Ω(n^2) : 선택 정렬, 버블 정렬 Ω(n log n) Ω(n) Ω(log n) Ω(1) : 선형 검색, 이진 검색 로 나눠볼 수 있습니다. 그런데 여기서 실행시간을 단축시킬수 있는 게 있을까요?? 생각해봅시다. 버블..

[CS50] 선택 정렬

저번 포스팅의 버블 정렬은 직관적이긴 하지만 O(n^2)의 시간이 소요된다고 했습니다. 이번에는 다른 정렬 알고리즘인 선택 정렬에 대해 공부해보도록 하겠습니다. 선택정렬 각 자료를 비교하는 횟수는 증가하지만 교환 횟수를 최소화하는 정렬입니다. 배열 안의 자료 중 가장 작은 수(혹은 큰 수)를 찾아 첫 번째 위치(혹은 가장 마지막 위치)의 수와 교환해주는 방식을 사용합니다. 버블 정렬과 마찬가지로 예를 들어 설명하자면 6 4 3 7 1 2 8 5 라는 정렬되지 않은 숫자가 있을 때 이를 선택 정렬을 이용해 오름차순으로 정리하는 방법은 우선 위의 수중에서 가장 작은 값을 찾습니다. (여기서 1) 1 4 3 7 6 2 8 5 // 1과 6의 위치를 바꿉니다. 그다음 1을 제외하고 4부터 시작해서 또 가장 작은..

[CS50] 버블 정렬

어떤 배열이 있을 때 그 배열이 이미 정렬되어있는 배열이라면 훨씬 빠른 속도로 검색이 가능합니다. 정렬하기 위한 방법은 여러 가지가 존재하고 각각 실행시간도 차이가 있습니다. 오늘은 정렬 기법 중 하나인 버블 정렬에 대해 공부해보도록 하겠습니다. 버블정렬 사실 이러한 정렬이 있다는 건 알고 있었지만 버블 정렬이라고 불리는지는 몰랐습니다. ㅎㅎ 버블 정렬은 거품이 떠오르듯 두 개의 인접한 자료값을 비교하면서 위치를 교환하는 방식으로 정렬하는 방법을 말합니다. 버블정렬은 단 두개의 요소만 정렬해주는 좁은 범위의 정렬에 집중하기 때문에 간단하지만 하나의 요소를 정렬하기 위해서 많은 낭비가 발생할 수 있습니다. 예를 들어 설명하자면 6 4 3 7 1 2 8 5 라는 순서의 숫자가 있습니다. 이를 오름차순으로 정..