본문 바로가기

분류 전체보기

(109)
재귀함수 재귀 함수는 "함수 내부에서 자기 자신을 호출하는 함수"다. 이름 그대로 자기 자신을 반복적으로 호출하면서 특정 조건이 충족될 때 실행을 종료한다. 이러한 동작은 프로그래밍에서 반복적인 문제를 간결하게 해결하는 데 유용하게 쓰인다. 1. 재귀 함수의 동작 원리재귀 함수는 호출될 때마다 함수의 인스턴스가 스택 메모리에 쌓인다. 이를 콜 스택(Call Stack)이라고도 부른다. 함수는 호출된 순서대로 스택에 쌓이고, 마지막에 호출된 함수부터 순차적으로 종료되면서 스택에서 제거된다. 이를 이해하기 위해 간단한 예제 코드를 보자. 재귀 함수 예제 코드 #include void recursive_function(int n) { if (n == 0) return; // 종료 조건 printf("Ente..
연결리스트란? 연결 리스트(Linked List)란 연결된 노드에 데이터를 저장하는 자료 구조이다. 각 노드는 데이터와 다음 노드를 가리키는 포인터를 가지고 있으며, 데이터를 동적으로 추가, 삭제할 수 있다. 연결리스트의 구성요소head : 연결 리스트에서 첫 번째 노드의 주소를 저장한 포인터node : 연결 리스트의 요소value : 노드에 저장된 데이터link: 다른 노드와의 연결을 위한 포인터 연결 리스트의 종료 단일 연결 리스트(Singly Linked List)'각 노드가 다음 노드에 대한 참조만 가진다./typedef struct node{ int val; struct node* next;}node;이중 연결 리스트(Doubly Linked List)각 노드가 이전 노드와 다음 노드에 대한 참조를 모두..
연결리스트와 배열의 비교 장점 연결 리스트: 데이터 삽입 및 삭제가 유연하며, 크기의 제한 없이 사용할 수 있다.배열: 인덱스를 통한 빠른 데이터 접근이 가능하며, 연속된 메모리 공간에 데이터를 저장하므로 캐시 효율성이 좋다.단점연결 리스트: 특정 위치에 접근할 때 순차적으로 노드를 따라가야 하므로 접근 속도가 느리다.배열: 크기를 미리 설정해야 하고, 크기 변경이 어려워 메모리 낭비가 발생할 수 있다. 특성배열 연결 리스트메모리 사용고정 크기(초기 할당 시 전체 크기를 설정)동적으로 할당(필요한 만큼만 사용)삽입 및 삭제중간 삽입/삭제 시 뒤의 원소를 모두 이동 (O(N))앞이나 중간 삽입이 용이인덱싱O(1)인덱스를 통한 즉시 접근 가능O(n) (연결을 따라가야 함)메모리 효율성데이터만 저장하므로 메모리 사용 효율적각 노드마다..
이중 연결 리스트(Doubly Linked List) 이중연결 리스트는 앞으로도 갈 수 있고, 뒤로도 갈 수 있는 자료구조이다. 이중연결 리스트의 핵심은 이전 노드와 다음 노드가 서로 연결되어있다는 점이다. 단일 연결 리스트와 달리, 이중 연결 리스트는 각 노드가 이전 노드를 가리키는 prev, 다음 노드를 가리키는 next 포인터 두개로 구성되어 있어 앞쪽과 뒤쪽 모두로 순회할 수 있다. 이러한 양방향 순회 기능은 리스트 내에서 삽입, 삭제, 탐색 작업을 효율적으로 수행할 수 있게 해준다.  배열에서 첫 번째 원소는 항상 0번째 인덱스이다. 하지만 연결 리스트에서는 첫 번째 원소가 어디에 있는지 표시하기 위해 `head`라는 포인터를 사용해서 첫 번째 노드를 가리키고, 리스트가 비어 있을 경우 `head`는 NULL을 가리킨다.그리고 끝을 표시하는 `ta..
알고리즘의 성능을 평가하는 빅오 표기법 컴퓨터의 일은 크게 두 가지로 나눌 수 있다. 데이터를 저장하는 일과 연산하는 일이다. 이때, 어떻게 하면 데이터를 적은 메모리에 저장할 수 있을까 고민하는 것이 자료 구조적인 부분이라면, 어떻게 하면 문제를 더 빠르고 정확하게 해결할 수 있을까 고민하는 것이 알고리즘적인 부분이다. 시간 복잡도시간 복잡도사용 예O(1)배열에서 원소 접근(random access)스택 자료구조에서 삽입(push)과 삭제(pop)큐에서 삽입(enqueue)과 삭제(dequeue)해시 테이블에서 원소 접근 O(logN)이진검색(binary search)O(N)배열에서 검색, 최솟값, 최댓값 찾기연결리스트에서 순회, 최솟값, 최댓값 찾기계수정렬(버킷정렬)O(NlogN)병합정렬퀵 정렬(평균 시간 복잡도)힙 정렬O(N^2)버블정렬..
단일 연결 리스트(Singly Linked List) 보호되어 있는 글입니다.
자료구조란? 자료구조, 왜 배워야할까? 나는 비전공자로서 정보처리기사를 취득한 후, C언어와 파이썬을 공부하며 프로그래머스 배지를 따기 위해 문제를 풀어나갔다. 문제 합격률 ~70%까지는 어떻게든 노가다(반복적인 작업)로 문제를 풀 수 있었지만, 난이도 있는 문제를 풀어보니 어느 순간 한계에 부딪히기 시작했다. 도저히 문제를 풀 수가 없게 된 것이다. 그때 나는 자료구조와 알고리즘을 왜 공부해야 하는지 깨달았다. 개발자가 자료구조를 모른다는 것은 마치 공사장에서 삽을 들고 땅을 파고 있는데, 설계도 없이 무작정 땅을 파고 철근을 아무렇게나 심고 있는 것과 같다는 것을 알게 되었다.특히 개발자는 한정된 메모리 자원 내에서 메모리를 효율적으로 사용해야 하는 숙명이 있다. 자료구조를 모른 채 코딩을 먼저 시작하면 프로그램..
예제로 보는 strtok 함수의 기능과 동작 원리 아래 예제 코드는 문자열 myString에서 "x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 사전순으로 정렬한 배열을 return 하는 solution 함수이다. 해당 코드에서 나는 strtok 함수를 사용했는데, 함수 사용이 익숙하지 않고 동작방식을 몰라 정리해서 기록하기로 하였다.특히, 문자를 자르는 함수라는건 알겠는데, 이 함수가 어떻게 구분자가 여러개 있으면 여러번 문자를 자를 수 있는지 이해가 잘 가지 않았다. 나를 포함해 strtok의 사용법이 익숙하지 않은 이들을 위해 strtok의 기능과 동작 방식을 설명해보겠다. #include #include #include #include // 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.char..