본문 바로가기

Data Structure [C]/문돌이도 할 수 있는 [C언어 자료구조]

(30)
#14 [C 자료구조] 구조체: 다른 타입들의 배열 구조체는 C와 몇몇 언어에만 있는 것으로 파이썬의 리스트 중 다른 타입들을 모아둔 것을 말한다. 즉 다시 말해 {이름, 최고 점수, 최저 점수, 평균} 이렇게 나타내 보자면 {char, int, int, double} 이러한 값을 가지게 되는 것이다. 여타 다른 언어에서는 그냥 나타나면 되지만 C에서는 이를 구조체라 부르고 한 번에 묶는다. 또한 구조체 선언 코딩은 다음과 같이 한다. struct student { char name[20]; int max_score, min_score; float avg_score; }; 구조체 선언은 안에 들어가는 것들을 정의해주는 작업이다. 여기서 student는 '구조체 태그' 안에 char, int, float 들은 '구조체 멤버'라 부른다. name [20]인 ..
#13 [C 자료구조] 배열과 포인터의 혼종 혼종은 아니다. 응용이다. 1차원 배열과 다차원 배열에서 포인터가 어떻게 활용되는지 조금만... 아주 조금만 더 알아보도록 하자. 더 이상 알아보면 자료구조에 질릴 수도 있겠다는 생각을 한다. 일반적인 배열 표기, 포인터로 배열 포기 1차원 배열의 간단한 인덱스를 보자 #include int main(void) { int ary[4] = {1, 2, 3, 4}; int i; for ( i=0; i
#12 [C 자료구조] 2차원 배열: 행렬이 된 배열 이전에 1차원 배열을 했을 때 직감했겠지만 불길한 느낌은 왜... 1차원 배열이 있으면 2,3,n 차 배열도 있을 것이다. 오늘은 다차원 배열에 대해서 간략하게 배워 보도록 하자. 알다시피 2차원은 행렬과 비슷하게 표기한다. int 배열이름[행 개수][열 개수] int abc[3][2] = {0,1,10,11,21,22,31,32} // or {{0,1},{10,11}, ~ }} 이렇게 표현할 수 도 있음 초기화 방법 int abc[][2] --> 2열 초기화 int abc[3][] --> 3행 초기화 int abc[3][2] = {0}, --> 전체행 초기화 그렇다면!!! 배열에서의 포인터는 어떻게 쓰일까? 배열 역시 포인터를 가질 수 있다. 예를 들어 num[3]의 1차원 배열의 주소는 첫 번째 배열..
#11 [C 자료구조] 이중 포인터: 나를 가르키는 너를 가르키는 타인 포인터는 포인터를 가리키는 포인터가 있다. 즉 변수
#10 [C 자료구조] 포인터가 뭐죠?: 자료의 저장 방법 파이썬과 자바스크립트와 같은 언어에서는 발견되지 않지만 C언어에서는 반드시 발견되는 것이 있다. 바로 포인터! 포인터는 특정한 데이터가 저장된 주소 값을 보관하는 변수이다. 예를 들어 내가 abc라는 데이터에 5라는 int를 부여했다고 하면 abc는 메모리 상의 어딘가에 저장이 됩니다. 그래야 나중에 변수를 호출해서 쓸 수 있으니까! 따라서 abc는 반드시 그 '어딘가'의 '주소 값' 또한 갖게 된다. 나중에 되면 헷갈리는데 머리에 박아두자. 포인터에서 자료구조를 포기하는 사람들이 많다. 정신줄 잡고 레-고!! [포인터 = 변수의 주소값] 배열(Array)에 대하여 배열은 포인터를 배우기 이전에 값들이 어떻게 저장되는지 알기 위해서 짚어주고 넘어가야 하는 부분이다. 배열의 특징에 대해서 알아보자! 1) ..
#9 [C 자료구조] 알고리즘의 기초 of 기초: 순환 예시 순환 실제 예시 이제는 순환 실전이다! 총 4가지의 종류에 대해서 순환문과 반복문의 차이를 알아보도록 하자. 거듭제곱 - 순환호출 순환호출st double power(double x, int n){ if (n==0) return 1; else if (n%2 == 0) return power(x*x, n/2); else return (x*power(x*x, (n-1)/2)); } n의 숫자를 계속 2로 쪼개서 순환 호출 중이다. #시간 복잡도 = O(log₂n) 업 -> 47 -> 앗 술이 들어간다 쭉쭉쭉쭉쭉 순환호출st value[]: 찾고자 하는 숫자가 있는 리스트 left: 가장 왼쪽 key right: 가장 오른쪽 key key: 찾고자 하는 숫자 int BS(int values[], int lef..
#8 [C 자료구조] 알고리즘의 기초 of 기초: 순환(Recursion) 알고리즘에서는 순환 개념이 많이 쓰인다. 순환이란 피보나치 수열의 예시처럼 알고리즘 도중 자기 자신을 호출하는 것을 의미한다. 피보나치의 경우엔 f(n) = f(n-1) + f(n-2) 의 식을 가지므로 무려 2명의 나를 호출하는 것이다. 이건 마치... 순환의 종류 순환의 종류는 두 가지로 나뉜다. 직접 순환 (Direct Recursion)은 피보나치 수열, 팩토리얼 등의 보편적인 예시라고 보면 되고 간접 순환 (Indirect Recursion)은 하나의 알고리즘이나 함수를 더 거쳐서 나오는 것이다. 꼬리순환 호출: n * factorial(n-1) 머리순환 호출: factorial(n-1) * n 예시: 팩토리얼의 순환 호출 팩토리얼은 다음과 같은 순환 단계를 거친다. 결국에 마지막 단계인 fac..
#7 [C 자료구조] 알고리즘 시간 복잡도 실전편 앞서 배운 알고리즘 복잡도 중 시간 복잡도가 성능 분석을 위해 쓰인다고 언급했다. 따라서 우리는 시간 복잡도를 실전에 어떻게 쓰이는지 알아볼 필요가 있다. 알고리즘은 최선의 경우와 최악의 경우, 평균의 경우로 나눠서 분석해볼 수 있다. 자 실전 예시를 보자!!! 예를 들어, 운 좋게 환승시간 딱딱 맞춰서 강의하러 학교에 간 경우 36분 집을 나와서 운나쁘게 열차를 놓쳐 4분을 기다리게 된 경우 40분 놀랍지 않게 우리의 알고리즘은 대부분 최악의 경우를 가정해서 나타낸다. 이 것이 바로 최악 경우 분석 (Worst Case Analysis)이다. 각각의 특징을 비교해보면 최악 경우 분석 성능 보장 마! 내가 적어도 이 정도는 한다! 평균 경우 분석 입력의 확률 분포 가정 마! 이건 내 보통 실력이다! 최선..