0️⃣ 들어가며...
이 글은, 누구나 자료구조와 알고리즘 [개정2판] 을 보고, 이미 노션에 정리했지만,
나 자신을 위해 핵심만 골라 다시 정리해보는 글, 즉 두번째 읽으면서 정리하는 글입니다.
중요 질문과 답변 위주로 정리하는 형식으로 글을 작성해 보겠습니다.
[목차]
1. 코드 품질의 평가 척도 2가지
2. 자료 구조란 무엇인가?
2-1. 그렇다면 데이터란 무엇인가?
2-2. 자료구조를 왜 알야아 하는가?
3. 자료 구조 연산 4가지
4. 속도 측정
5. 알고리즘이란?
6. 이진검색 vs 선형 검색
7. 기타용어 & checkList
8. 마무리
1️⃣ 코드 품질의 평가 척도 2가지
코드 품질은 다양한 척도로 평가할 수 있지만, 그 중 중요한 것 두가지는 다음과 같다.
1. 코드 유지 보수성 (가독성, 조직, 코드 모듈성 같은 측면을 포함)
2. 코드 효율성 ( 더 빠르게 실행되게하는 코드 )
빠른 코드를 작성하는 첫 번째 단계는 자료 구조가 무엇인지,
다양한 자료구조가 코드 속도에 어떠한 영향을 미치는지 이해하는 것이다.
2️⃣ 자료 구조란 무엇인가?
자료 구조란 데이터를 조직하는 방법이다.
2-1. 그렇다면 데이터란 무엇인가?
데이터란, 일반적으로 모든 유형의 정보를 망라하는 용어이며, 가장 기초적인 수와 문자열로 이뤄진다.
예시) "Hello World!" 프로그램을 떠올리면, "Hello World!" 문자열이 바로 데이터다.
데이터를 어떻게 조직하는가에 따라 프로그램은 수십 수백 배 더 빠르게 혹은 더 느리게 실행될 수 있다.
2-2. 자료구조를 왜 알아야 하는가?
소프트웨어를 문제없이, 빠르게 실행할 수 있는 명쾌한 코드를 작성하는 능력을 갖추고 소프트웨어 공학자가 가져야 하는 전문성을 키우려면 다양한 자료 구조를 알고, 각각의 자료 구조가 개발중인 프로그램의 성능에 어떤 영향을 미칠지 확실히 이해하고 있어야 한다.
3️⃣ 자료 구조 연산 4가지
대부분의 자료 구조는 네 가지 기본 방법을 사용하며, 이를 '연산' 이라고 부릅니다.
[배열 연산의 종류]
1. 읽기 : 자료 구조 내 특정 위치를 찾아보는 것 ✅ O(1)
2. 검색 : 자료 구조 내에서 특정 값을 찾는 것 ✅ O(N)
3. 삽입 : 자료 구조에 새로운 값을 추가하는 것 ✅ O(N+1)
4. 삭제 : 자료 구조에서 값을 제거하는 것 ✅ O(N)
4️⃣ 속도 측정
Q4-1. 연산의 속도를 어떻게 측정할까?
연산이 얼마나 "빠른가"를 측정할 때는
순수하게 시간 관점에서 연산이 얼마나 빠른가가 아니라
얼마나 많은 단계가 필요한지를 논해야 한다.
Q4-2. 왜 코드의 속도를 단계로 측정할까?
1. 같은 연산이라도 컴퓨터마다 다르게 측정된다.
2. 시간은 연산을 실행하는 하드웨어에 따라 항상 바뀌므로 시간을 기준으로 속도를 측정하면 신뢰할 수 없다.
3. 대신, 연산의 속도를 측정할 때 얼마나 많은 계산 단계(step)가 필요한가를 따져볼 수 있다.
예를들어, 연산 A에 5단계가 필요하고 연산B에 500단계가 필요하면, 모든 하드웨어에서 연산 A가 연산 B보다 항상 빠를 거라고 가정할 수 있다.
결국, 단계 수 측정이 연산 속도를 분석하는 핵심 비결
✅ 알아두면 좋을 컴퓨터의 특징 3가지
특징1. | 1. 컴퓨터는 모든 메모리 주소에 한 번에 갈 수 있다. 2. 컴퓨터는 배열을 할당할 때 어떤 메모리 주소에서 시작하는지도 기록해 둔다. → (1,2번) 이 컴퓨터가 배열의 첫 번째 값을 어떻게 한 번에 찾아내는지 설명한다. 3. 컴퓨터는 어떤 인덱스에 있는 값이든 간단한 덧셈을 수행해 찾을 수 있다. |
특징2. | 컴퓨터는 모든 메모리 주소에 한 번에 접근하지만 각 메모리 주소에 어떤 값이 있는지 바로 알지 못한다. |
특징3. | 배열을 할당할 때 항상 배열의 크기를 기록한다는 특징 |
5️⃣ 알고리즘이란?
단순히 어떤 과제를 완수하는 명령어 집합일 뿐이다.
6️⃣ 이진 검색 vs 선형 검색
선형 검색 | 이진검색 |
원소 수만큼의 단계가 필요하다. 배열의 원소 수를 두 배로 늘릴 때마다 검색에 필요한 단계 수도 두 배로 늘어난다. |
배열의 원소 수를 두배로 늘릴 때마다 한 단계만 늘어난다. |
• 정렬된 배열이 모든 상황에서 빠른 것은 아니다. ◦ 정렬된 배열의 삽입은 일반 배열보다 느리다. ◦ 하지만 장단점이 있다. ◦ 정렬된 배열을 사용하면 삽입은 다소 느리지만, 검색은 훨씬 빠르다. |
5️⃣ 기타 용어 & CHECK LIST
1 | 선형 검색 (linear search) |
컴퓨터가 한 번에 한 셀씩 확인하는 방법 |
2 | 집합 | 중복 값을 허용하지 않는 자료구조 |
3 | ✅ CheckList | 모든 삽입에는 검색이 우선이다. |
8️⃣ 마무리 [핵심 정리]
책 1장의 핵심은 다음과 같다.
🟥자료 구조란 데이터를 조직하는 방법이다.
🟥 자료구조의 성능 측정은 연산에 필요한 단계 수를 구하는게 핵심이다.
책 2장의 핵심은 다음과 같다.
🟥 알고리즘이란 단순히 어떤 과제를 완수하는 명령어 집합일 뿐이다.
🍀 어떤 컴퓨팅 목표를 달성하는 방법은 대개 둘 이상 있으며, 사용자가 선택하는 알고리즘이 코드의 속도에 크게 영향을 줄 수 있다. 모든 상황에 완벽하게 들어맞는 단 하나의 자료 구조나 알고리즘은 거의 없다.
9️⃣ 생각정리
[23년12월 28일 오후 5시 43분]
🍀 내가 나에게 던지는 질문
✅ 프론트앤드 개발자로서 자료구조와 알고리즘에 대해 얼마나 알아야 할까?
이 질문에 대해 솔직한 마음으로 프론트앤드 개발자가 자료구조와 알고리즘을 실질적으로 쓸 일이 많을까?
라는 생각이 먼저 들었다.
하지만 실제로 사용하는가와는 별개로, 좋은 기업에 가기 위해서는 코딩테스트에 합격해야 하고, 이를 위해서라면 필수적인 요소라고 생각한다.
🟥 프론트앤드 개발자에게 자료구조와 알고리즘이 중요한것과 상관없이 나에게 있어서는 매우 중요하다.
나는 지금 프론트앤드 개발자로서 개발인생을 준비하고 있지만, 결국에 좋은 개발자가 되기 위해서는 프론트 뿐만 아니라 백엔드 분야의 지식까지 알아야 한다고 생각한다.
또한 글의 2-2를 보면 다음과 같은 말이 나온다.
소프트웨어를 문제없이, 빠르게 실행할 수 있는 명쾌한 코드를 작성하는 능력을 갖추고 소프트웨어 공학자가 가져야 하는 전문성을 키우려면 다양한 자료 구조를 알고, 각각의 자료 구조가 개발중인 프로그램의 성능에 어떤 영향을 미칠지 확실히 이해하고 있어야 한다.
매일매일 발전하고 있는 AI가 지금의 나보다 코딩을 더 잘한다.
앞으로 세상이 어떻게 변할지는 모르겠지만, 개발자로서 살아남기 위해서는 기본 주 언어(나의경우 자바스크립트)에 더해 자료구조와 알고리즘같은 기본기는 마치 나무의 뿌리와 같다고 생각한다.
(사실 중요한 기본기가 너무 많지만, 자료구조 & 알고리즘 관련 글이기에 이정도만 적겠다.)
나무가 크게 자라기 위해서는 땅 깊숙히 잘 박혀있어야 한다.
그렇지 않으면, 태풍과같은 자연재해(역경)이 닥쳐온다면 결국엔 무너지게 될 것이다.
그때가서 다시 자라날 수도 있겠지만, 그러지 않도록,
앞으로 개발공부 하는데 있어 자료구조 알고리즘은 지금처럼 매일 꾸준히하는 습관중 하나로 자리잡기를 바라고 행동할 것을 다짐하며 글을 마무리 짓겠다.
✅ 23년12월 28일 현재 상태기록
전체적인 자료구조 & 알고리즘 관련 개념들을 빠르게 한번 훑은 상태
매일 2시간정도 투자하고 있는 상태이다.
'자료구조 & 알고리즘 > 자료구조[data structure]' 카테고리의 다른 글
[자료구조2편] 시간이 부족한 비전공 개발자에게 알려주는 BigO (빅오) - [누구나 자료구조와 알고리즘 개정2판 3-6장 요약] (7) | 2023.12.31 |
---|