분류
[ 펼치기 · 접기 ]이론 다루는 대상 주요 토픽 알고리즘 자료구조 정리
| ||||||||||||||||||||||||||||||||||||
[ 펼치기 · 접기 ]
|
資料構造 / data structure
컴퓨터과학에서 데이터를 구조적으로 표현하는 방식과 이를 구현하는 데 필요한 알고리즘에 대해 논하는 기초이론, 혹은 과목이다. 데이터를 구성하고 저장하는 방법으로, 데이터에 효율적으로 접근하기 위해 데이터 사이에 존재하는 관계를 개념화한 것이다. 컴퓨터과학에서 알고리즘과 함께 가장 중요한 기초이론으로, 이를 건너뛰고 상위 과목을 공부하는 건 사실상 불가능하다. 영어로 치면 알파벳을 모르는 상태로 독해를 공부하겠다는 것과 마찬가지로 볼 만큼 프로그래밍에서 중요한 부분이다.
리스트, 스택, 큐, 원형 큐, 힙, 트리, 그래프 7가지 개념을 숙지하면 자료구조 대부분 이해한 것이라 보면 된다.
컴퓨터과학에서 데이터를 구조적으로 표현하는 방식과 이를 구현하는 데 필요한 알고리즘에 대해 논하는 기초이론, 혹은 과목이다. 데이터를 구성하고 저장하는 방법으로, 데이터에 효율적으로 접근하기 위해 데이터 사이에 존재하는 관계를 개념화한 것이다. 컴퓨터과학에서 알고리즘과 함께 가장 중요한 기초이론으로, 이를 건너뛰고 상위 과목을 공부하는 건 사실상 불가능하다. 영어로 치면 알파벳을 모르는 상태로 독해를 공부하겠다는 것과 마찬가지로 볼 만큼 프로그래밍에서 중요한 부분이다.
리스트, 스택, 큐, 원형 큐, 힙, 트리, 그래프 7가지 개념을 숙지하면 자료구조 대부분 이해한 것이라 보면 된다.
추상적 자료형은 알고리즘이 문제를 해결하는 데 필요한 자료의 형태와 자료를 사용한 연산들을 수학적으로 정의한 모델이다. 그리고 자료구조는 추상적 자료형이 정의한 연산들을 구현한 구현체를 가리키는 말이다. 스택의 예를 들면, 함수 호출을 관리하기 위해 후입선출의 성질을 가진 추상적 자료형이 필요하니
따라서 자료구조와 추상적 자료형은 구분해 쓰는 것이 맞지만, 자료구조라는 단어가 광범위하게 쓰이다 보니 추상적 자료형을 가리키는 데 쓰이는 일도 부지기수다. 혼란의 가장 큰 원인은 추상적 자료형과 그것을 구현한 자료구조의 이름이 비슷하거나 아예 같은 경우가 아주 많다는 것. 콜 스택이 스택을 구현한 자료구조의 이름이고, 연결 리스트가 리스트를 구현한 자료구조 중 하나라거나. 게다가 추상적 자료형을 구현하는 데 하위에 다른 추상적 자료형들을 정의해서 그것들을 자료구조로 구현한다거나, 자료구조를 구현할 때도 마찬가지로 다른 자료구조를 가져다 쓰는 경우가 많다 보니 쉽게 헷갈린다.
제대로 구분하는 방법은 조금이라도 구현 방법이 정해져 있는지 보는 것. 스택은 구현방법이 전혀 정의되어 있지 않으니일반적인 방법은 있지만 추상적 자료형이고, 큐도 마찬가지다. 반면에 배열은 연속적으로 저장되어 있도록 구현되어 있어야 하므로 자료구조이고, 연결 리스트도 다음 데이터의 위치를 저장하는 방식으로 정해져 있으니 자료구조이다. Java로 치면 클래스인지 인터페이스인지를 확인하면 된다.
pop과 push를 가지도록 스택이라는 추상적 자료형을 정의하고, 그것을 구현해서 함수 호출을 관리하는 데 사용하는 구현체, 즉 자료구조를 콜 스택이라고 부르는 것이다.따라서 자료구조와 추상적 자료형은 구분해 쓰는 것이 맞지만, 자료구조라는 단어가 광범위하게 쓰이다 보니 추상적 자료형을 가리키는 데 쓰이는 일도 부지기수다. 혼란의 가장 큰 원인은 추상적 자료형과 그것을 구현한 자료구조의 이름이 비슷하거나 아예 같은 경우가 아주 많다는 것. 콜 스택이 스택을 구현한 자료구조의 이름이고, 연결 리스트가 리스트를 구현한 자료구조 중 하나라거나. 게다가 추상적 자료형을 구현하는 데 하위에 다른 추상적 자료형들을 정의해서 그것들을 자료구조로 구현한다거나, 자료구조를 구현할 때도 마찬가지로 다른 자료구조를 가져다 쓰는 경우가 많다 보니 쉽게 헷갈린다.
제대로 구분하는 방법은 조금이라도 구현 방법이 정해져 있는지 보는 것. 스택은 구현방법이 전혀 정의되어 있지 않으니
학교에서는 주로 기초 컴퓨터 프로그래밍 언어를 익힌 후 배우므로, 대학교 컴퓨터 계열 학과의 1학년 2학기에서 2학년 1학기 쯤 대부분 수강하게 되며, 가끔가다 1학년 1학기에 같이 시작하는 곳도 있다. 다만 정보계열 실업계 고등학교 학생들의 경우 2학년부터 배우게 되는데 덕분에 프로그래밍 기초나 작업과 같은 과목에 대해선 의외로 강세를 보이기도 한다. 다만, 과목 이름만 자료구조이고, 엑셀, 파워포인트 등을 하는 경우도 있다.
간단한 리스트부터 수업에 따라 B-트리까지 익히는 편이다. 이 과목이 자료구조를 직접 활용하기 때문에 중요하다기 보다는, 프로그램을 작성할 때 되는 대로 막 짜는 게 아니라 한 번이라도 전체적인 프로그램의 흐름(혹은 구조)에 대해 생각하게 만들기 때문에 중요하다. 한국에서 거의 이러한 일이 일어나지 않지만, 운영체제 또는 특정 목적으로 동작하는 프로그램 엔진 등을 제작하게 될 때에는 정말 잘 알아야 하는 과목이다. 자료 구조에 따라 프로그램 자체의 지원 가능한 기능과 성능 자체가 확확 바뀌는 경우가 발생하기 때문이다. 이러저러한 이유로 여러 컴퓨터과학 전공과목 중에서 전공심화 과목들은 기본적으로 이 과목을 요구하는 경우가 많다.
정렬과 이진 탐색은 엄밀히 말해 자료구조가 아닌 알고리즘에 속하지만, 배열 등의 자료구조와 밀접하게 연관되고 알고리즘 중에서도 비교적 쉬운 축에 속하므로 대부분 함께 배우는 경우가 많다. 자료구조도 좀 깊이 들어가 보면 어떤 알고리즘을 사용하기 위해 개발된 것들이 많다.
강의에서는 주로 다음과 같은 내용을 다루게 된다.
간단한 리스트부터 수업에 따라 B-트리까지 익히는 편이다. 이 과목이 자료구조를 직접 활용하기 때문에 중요하다기 보다는, 프로그램을 작성할 때 되는 대로 막 짜는 게 아니라 한 번이라도 전체적인 프로그램의 흐름(혹은 구조)에 대해 생각하게 만들기 때문에 중요하다. 한국에서 거의 이러한 일이 일어나지 않지만, 운영체제 또는 특정 목적으로 동작하는 프로그램 엔진 등을 제작하게 될 때에는 정말 잘 알아야 하는 과목이다. 자료 구조에 따라 프로그램 자체의 지원 가능한 기능과 성능 자체가 확확 바뀌는 경우가 발생하기 때문이다. 이러저러한 이유로 여러 컴퓨터과학 전공과목 중에서 전공심화 과목들은 기본적으로 이 과목을 요구하는 경우가 많다.
정렬과 이진 탐색은 엄밀히 말해 자료구조가 아닌 알고리즘에 속하지만, 배열 등의 자료구조와 밀접하게 연관되고 알고리즘 중에서도 비교적 쉬운 축에 속하므로 대부분 함께 배우는 경우가 많다. 자료구조도 좀 깊이 들어가 보면 어떤 알고리즘을 사용하기 위해 개발된 것들이 많다.
강의에서는 주로 다음과 같은 내용을 다루게 된다.
- 혼합 자료구조(Composite Data Structure)
- 선형 자료구조(Linear Data Structure)
- 배열 (Array)
- 예시: C++의 정적 배열
std::array<T, N> - 예시: C++의 동적 배열
std::vector<T>
- 연결 리스트 (Linked List)
- 추상적 자료구조(Abstract Data Structure)
- 사전 자료구조 (Dictionaries)
- 연관 배열 (Associative Array): Map이라고 칭하기도 한다.
- 예시: C++의 사상 자료구조
std::map<T>
- 연관 리스트
- 해시 테이블
- 예시: C++의 해시 자료구조
std::unordered_map<T>
데이터를 컴퓨터로 처리하는 방식을 다루는 것이기 때문에, 구현을 생각하지 않는 아주 추상적인 이론이 아닌 이상 반드시 사용해야만 하는 기초 이론이다.
자신이 프로그래머가 되고 싶다면 최소한 연결 리스트와 이진 트리는 평생 머릿속에 담아두고 있어야 한다. 이 두 자료구조를 이해하지 못하면 스스로 알고리즘을 설계하는 데 엄청난 애로사항이 꽃핀다. B트리나 AVL트리 같은 건 몰라도 된다. 따지고 보면 B트리와 AVL트리는 그냥 균형이 자동으로 잡히는 이진 트리로, 전용 알고리즘에 의해 관리되는 특수 자료구조에 불과하다. 즉 이진 트리의 응용형이다. 그래프는 연결 리스트의 응용형. 이진 트리는 그래프에 어떤 제약이 가해진 특수 형태. 이런 식으로 가지쳐 나가는 거라(책에 따라 반대로 서술하는 경우가 있다. 그래프는 이진 트리에서 제약을 제거한 거라는 식으로) 저 두 자료구조는 가장 중요하다.
Python이 인기 있는 이유 중 하나는 파이썬의 기본 자료구조인 리스트, 튜플, 딕셔너리가 사용하기 편리하며 C(프로그래밍 언어)로 구현되어 있어 속도도 꽤 빠르기 때문이다. 하지만 C(프로그래밍 언어)로 구현된 기본 자료구조를 사용하지 않고 Python으로 만들면 속도를 따라잡을 수 없기 때문에 연결 리스트 같은 것을 실습하기엔 좋지 않다. 그래서 Python으로 자료구조나 알고리즘을 실습한다면 최소한 그래프, 트리 등의 자료구조나 그 이상은 가는 것이 권장된다.
전산직 공무원 (전산 개발) 시험에서는 9급의 경우 컴퓨터일반 과목에서, 7급의 경우 자료구조론 과목에서 다뤄지는 내용이다.
컴퓨터 관련 학과 학생들을 굉장히 힘들게 하는 과목 중 하나인데, 기초 프로그래밍에 비해 난이도가 확 뛰는 데다가 자료구조를 모르면 이후 과목을 이해할 수도 없기 때문에 좋건 싫건악으로 깡으로 들어야 한다. 교수마다 다르긴 하지만 이 과목은 과제량도 매우 많은 편이다. 기초 프로그래밍은 수월하게 뗐는데 자료구조에서 낙오되고 이쪽 진로는 GG치는 학생들도 많다.[1] 필수 과목이라 수강신청에 실패할 경우 커리큘럼이 대차게 꼬이고[2], 재수강이 필요한 학생도 많아서 컴퓨터 관련 학과에서는 계절학기의 단골 과목 중 하나이다.
25년 1회차부터 출제위원들이 제대로 미친 것인지 정보처리기사의 난이도를 미친 난이도로 끌어올리기 위해서 대량으로 쳐넣었다. 1화차에서만 무려 5문제가 출제됐는데 덕분에 수험생들이 시험장에서 본인의 머리가 안 좋으니 저능아니 왜 코딩을 자꾸 이상한 데서 쳐넣냐는 불만이 정보처리기사 갤러리 등지에서 마침내 폭발하기에 이른다.
자신이 프로그래머가 되고 싶다면 최소한 연결 리스트와 이진 트리는 평생 머릿속에 담아두고 있어야 한다. 이 두 자료구조를 이해하지 못하면 스스로 알고리즘을 설계하는 데 엄청난 애로사항이 꽃핀다. B트리나 AVL트리 같은 건 몰라도 된다. 따지고 보면 B트리와 AVL트리는 그냥 균형이 자동으로 잡히는 이진 트리로, 전용 알고리즘에 의해 관리되는 특수 자료구조에 불과하다. 즉 이진 트리의 응용형이다. 그래프는 연결 리스트의 응용형. 이진 트리는 그래프에 어떤 제약이 가해진 특수 형태. 이런 식으로 가지쳐 나가는 거라(책에 따라 반대로 서술하는 경우가 있다. 그래프는 이진 트리에서 제약을 제거한 거라는 식으로) 저 두 자료구조는 가장 중요하다.
Python이 인기 있는 이유 중 하나는 파이썬의 기본 자료구조인 리스트, 튜플, 딕셔너리가 사용하기 편리하며 C(프로그래밍 언어)로 구현되어 있어 속도도 꽤 빠르기 때문이다. 하지만 C(프로그래밍 언어)로 구현된 기본 자료구조를 사용하지 않고 Python으로 만들면 속도를 따라잡을 수 없기 때문에 연결 리스트 같은 것을 실습하기엔 좋지 않다. 그래서 Python으로 자료구조나 알고리즘을 실습한다면 최소한 그래프, 트리 등의 자료구조나 그 이상은 가는 것이 권장된다.
전산직 공무원 (전산 개발) 시험에서는 9급의 경우 컴퓨터일반 과목에서, 7급의 경우 자료구조론 과목에서 다뤄지는 내용이다.
컴퓨터 관련 학과 학생들을 굉장히 힘들게 하는 과목 중 하나인데, 기초 프로그래밍에 비해 난이도가 확 뛰는 데다가 자료구조를 모르면 이후 과목을 이해할 수도 없기 때문에 좋건 싫건
25년 1회차부터 출제위원들이 제대로 미친 것인지 정보처리기사의 난이도를 미친 난이도로 끌어올리기 위해서 대량으로 쳐넣었다. 1화차에서만 무려 5문제가 출제됐는데 덕분에 수험생들이 시험장에서 본인의 머리가 안 좋으니 저능아니 왜 코딩을 자꾸 이상한 데서 쳐넣냐는 불만이 정보처리기사 갤러리 등지에서 마침내 폭발하기에 이른다.
이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외)
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.
나무위키는 백과사전이 아니며 검증되지 않았거나, 편향적이거나, 잘못된 서술이 있을 수 있습니다.
나무위키는 위키위키입니다. 여러분이 직접 문서를 고칠 수 있으며, 다른 사람의 의견을 원할 경우 직접 토론을 발제할 수 있습니다.