전체 글
-
[메모리] 문자열 비교Stage/Computer Science 2021. 5. 31. 23:17
학습 목표 문자열이 저장되어 있는 방식에 근거해서 문자열을 비교하는 방법에 대해 설명할 수 있다. 1. 예시 #include int main(void) { char *s = "EMMA"; printf("%p\n", s); } 코드를 실행하면? "EMMA" 라는 문자열의 첫번째 값인 "E"의 메모리 주소가 출력이 된다. printf("%p\n", &s[0]); printf("%p\n", &s[1]); printf("%p\n", &s[2]); printf("%p\n", &s[3]); 이 코드를 실행하면 어떻게 나올까? s라는 문자열의 첫번째 값인 "E"의 메모리 주소, 두번째 값인 "M"의 메모리 주소..... 2. 문자열 비교 #include #include int main(void) { string s ..
-
[메모리] 문자열Stage/Computer Science 2021. 5. 31. 23:15
학습 목표 문자열 형태의 새로운 자료형인 string이 어떻게 정의되었는지 설명할 수 있다. 1. string의 비밀 우리는 여태껏 수업을 들으면서 문자열을 저장할 때 CS50 라이브러리에 포함된 string 자료형을 사용했다. string s = “EMMA”; 문자열은 결국엔 문자의 배열이다. s[0], s[1], s[2]... 이렇게 인덱스 하나로 문자 하나를 나타낸다. 사실 변수 s는 이런 문자열을 가리키는 포인터가 된다. 더 자세히 말하자면 문자열 중에서 첫번째 문자, 즉 주소 0x123에 있는 s[0]을 가리킨다. 2. CS50 라이브러리 확인해보기 실제 CS50 라이브러리에 가서 확인해보면 string 자료형은 이렇게 나와있다. typedef char *string 이 부분만 보면 이해가 잘 ..
-
[메모리] 포인터Stage/Computer Science 2021. 5. 31. 22:27
학습 목표 포인터 변수를 정의하고 사용할 수 있다. 1. * & 연산자는 메모리의 주소를 가져오는 것이고, * 연산자는 메모리의 주소에 있는 값을 가져오는 것이라고 배웠다. 그리고 우리는 이 연산자를 이용해서 포인터 역할을 하는 변수를 선언할 수도 있다. 1.1 포인터 역할을 하는 변수 선언 #include int main(void) { int n = 50; int *p = &n; printf("%p\n", p); printf("%i\n", *p); } int n 에 50이라는 값이 저장 돼있고, n의 주소를 가져 와서 *p 변수에 저장하고 있다. 한번도 본 적 없는 게 나왔는데, int *p에서 *는 이 변수는 포인터 입니다를 나타내고, int는 이 포인터가 int 타입의 변수를 가리킨다는 의미이다. ..
-
[메모리] 메모리 주소Stage/Computer Science 2021. 5. 31. 22:25
학습 목표 16진법을 읽고 쓸 수 있다. 메모리 주소에 접근하고 값을 받아오는 코드를 C로 작성할 수 있다. 1. 16진수(Hexadecimal) 컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수로 표현하는 경우가 많다. 왜??? 당연히 10진수나 2진수 대신 16진수로 표현할 경우에 장점이 있기 때문인데, 그 이유를 알아보자. 1.1 10진수를 16진수로 바꾸기 우리가 생활하면서 사용하는 10진수와 16진수를 비교해보면 이유를 바로 알 수 있다. 10진수 255를 2진수로 바꾸면 11111111과 같다. 컴퓨터는 2진수를 사용하기 때문에 255를 11111111로 표현해야하지만, 너무 길다. 255뿐만 아니라 모든 데이터를 2진수로 표현해야 한다고 가정하면 너무 길어진다. 이를 16진수로 한번 표..
-
[알고리즘] 병합 정렬Stage/Computer Science 2021. 5. 29. 00:53
학습 목표 재귀를 활용한 병합 정렬을 구현할 수 있다. 1. 정렬 알고리즘 대표적인 정렬방법 중 하나이다. 전화번호부에서 mike를 찾기 위해 절반을 나눠서 탐색해나갔던 분할 정복 탐색처럼 데이터를 반으로 나누어간다는 공통점이 있다. 병합 정렬은 원소가 한 개가 될 때까지 반으로 나누다가 다시 합쳐나가며 정렬을 하는 방식이다. 2. 예시 임의로 나열된 8개의 숫자를 오름차순으로 정렬해보자. 7 4 5 2 6 3 8 1 먼저 숫자를 반으로 나누자. 7 4 5 2 | 6 3 8 1 나눠 놓은 덩어리를 한번 더 나눠보자. 7 4 | 5 2 | 6 3 8 1 또 나누자. 7 | 4 | 5 2 | 6 3 8 1 원소가 한 개가 남았으므로 더 이상 나눌 수가 없다. 두 숫자를 작은 숫자가 먼저 오도록 병합하자. 4..
-
[알고리즘] 재귀Stage/Computer Science 2021. 5. 29. 00:53
학습 목표 함수를 재귀적으로 사용하는 코드를 작성할 수 있다. 1. 재귀? main에서 필요할 때 다른 함수들을 호출해서 사용했던 상황을 떠올려 보자. 생각해보면 main도 함수인데 main이라는 함수 안에서 다른 함수를 호출해서 사용한 것이다. 그렇다면 함수가 본인 스스로를 호출해서 사용할 수 있을까? -> YES. 이를 재귀(Recursion)라고 부른다. 2. 피라미드를 출력하자 # ## ### #### #include #include void draw(int h); int main(void) { int height = get_int("Height: "); draw(height); } void draw(int h) { // 높이가 0이라면 (그릴 필요가 없다면) if (h == 0) { return..
-
[알고리즘] 정렬 알고리즘의 실행시간Stage/Computer Science 2021. 5. 29. 00:52
학습 목표 여러 정렬 알고리즘과 검색 알고리즘의 실행 시간을 Big O와 Big Ω로 정의할 수 있다. 1. 실행시간 정리 1.1 실행시간의 상한 O(n^2): 선택 정렬, 버블 정렬 O(n log n) O(n): 선형 검색 O(log n): 이진 검색 O(1) 1.2 실행시간의 하한 Ω(n^2): 선택 정렬 Ω(n log n) Ω(n): 버블 정렬 Ω(log n) Ω(1): 선형 검색, 이진 검색 #이 파트는 이해 못해서 문제 다 틀렸다. 구글링 해서 자료 보강하고 추가 해놓을 것.
-
[알고리즘] 선택 정렬Stage/Computer Science 2021. 5. 29. 00:50
학습 목표 선택 정렬의 원리와 실행 시간을 설명하고 구현할 수 있다. 1. 정렬 알고리즘 정렬 알고리즘 중 하나인 선택 정렬은 배열 안에 나열된 자료 중 가장 작은 수(혹은 가장 큰 수)를 찾아 첫 번째 위치(혹은 가장 마지막 위치)의 수와 교환해주는 방식의 정렬이다. 선택 정렬은 교환 횟수를 최소화하지만 각 자료를 비교하는 횟수는 증가한다. 2. 예시 정렬되지 않은 숫자 8개가 있다. 이 숫자들을 오름차순으로 정렬해보자. 6 3 8 5 2 7 4 1 숫자들을 끝까지 탐색하면서 제일 작은 수를 찾는다. 6 3 8 5 2 7 4 1 가장 작은 값과 현재 리스트의 첫 번째 값을 교환한다. 1 3 8 5 2 7 4 6 1은 이제 정렬이 되어 있으니 제외하고, 두 번째 숫자부터 탐색하면서 또 제일 작은 수를 찾..