🗓️ 2025년 7월 11일 (금) 오늘 하루 일정
✅ 오전
- 09:00 ~ 11:30
- 알고리즘 기초 개념 학습
- 시간 복잡도 vs 공간 복잡도
- 정렬 알고리즘 개요 및 종류
- 선택 정렬, 삽입 정렬, 버블 정렬, 퀵 정렬, 병합 정렬 정리
- 탐색 알고리즘 개요 및 DFS, BFS, 이진 탐색 정리
- 최단 경로 알고리즘: 다익스트라, 벨만-포드
- 알고리즘 기초 개념 학습
- 11:30 ~ 13:00
- C# 체크리스트 강의 Day.4 수강 (반복문 주제)
🍽️ 점심시간
- 13:00 ~ 14:00
- 점심시간
✅ 오후
- 14:00 ~ 18:00
- 오전에 학습한 알고리즘 전체 복습
- 문제 풀이: Histogram에서 최대 직사각형 (LeetCode 84)
- ToList(), Stack 사용 방식, while 조건 이해
- 문제 풀이: Flood Fill (LeetCode 733)
- DFS를 이용한 그림 색칠 방식 이해
- 문제 풀이: Longest Increasing Subsequence (LeetCode 300)
🍽️ 저녁시간
- 18:00 ~ 19:00
- 저녁시간
✅ 저녁
- 19:00 ~ 20:30
- 정렬 알고리즘 & 탐색 알고리즘 복습
- 삽입 정렬 while문의 역할
- List와 배열, 제네릭 타입 관련 개념 정리
- 정렬 알고리즘 & 탐색 알고리즘 복습
✅ 오늘 학습 키워드
- 시간 복잡도 / 공간 복잡도
- 기초 정렬 알고리즘
- 선택 정렬
- 삽입 정렬
- 버블 정렬
- 고급 정렬 알고리즘
- 퀵 정렬
- 병합 정렬
- 탐색 알고리즘
- 선형 탐색
- 이진 탐색
- DFS / BFS
- 최단 경로 알고리즘
- 다익스트라
- 벨만-포드
- C# 리스트 구조 이해
- List<int> vs List<int>[]
- List<(int, int)> 구조
- 문제 풀이 실습
- 84번: Histogram에서 가장 큰 직사각형
- 733번: Flood Fill
- 300번: 최장 증가 부분 수열 (LIS)
✅ 오늘 학습 한 내용을 나만의 언어로 정리하기
C# - TextRPGGame(Console)
🧙♂️ 텍스트 기반 RPG 게임 (Text RPG)간단한 콘솔 기반의 텍스트 RPG 게임입니다.2일간 집중 개발하여 기본적인 전투, 아이템, 레벨업, 저장/불러오기 등의 기능을 구현했습니다. ✨ 주요 기능
dev-jen.tistory.com
C# - Big-O 표기법 정리 – 알고리즘 성능의 기준
📊 Big-O 표기법 완벽 정리 – 알고리즘 성능의 기준1. Big-O란 무엇인가?Big-O 표기법은 **알고리즘의 효율성(시간 또는 공간 사용량)**을 수학적으로 표현하는 방식이다.입력의 크기 n에 따라 알고
dev-jen.tistory.com
C# - 시간 복잡도 vs 공간 복잡도
1. 개념 정리⏱️ 시간 복잡도 (Time Complexity)알고리즘이 실행되는 데 걸리는 연산 횟수를 입력 크기 n에 따라 수학적으로 표현한 것O(n), O(n²), O(log n)처럼 Big-O 표기법으로 나타냄실제 시간(초)이
dev-jen.tistory.com
C# - 정렬 알고리즘 – 선택, 삽입, 퀵, 병합 정렬 비교
🔀 정렬 알고리즘 – 선택, 삽입, 퀵, 병합 정렬 비교1. 정렬 알고리즘이란?정렬 알고리즘은 **주어진 데이터를 일정한 순서(예: 오름차순, 내림차순)**로 재배열하는 알고리즘이다.알고리즘의 기
dev-jen.tistory.com
C# - 삽입 정렬 (Insertion Sort)
📥 삽입 정렬 (Insertion Sort) – 직관적이고 효율적인 정렬 방법1. 개념삽입 정렬은 카드 정렬과 비슷한 방식으로 작동한다.두 번째 원소부터 시작해서, 앞쪽 정렬된 구간에 자신이 들어갈 자리를
dev-jen.tistory.com
C# - 퀵 정렬 (Quick Sort)
⚡ 퀵 정렬 (Quick Sort) – 빠르고 강력한 분할 정복 정렬 알고리즘1. 개념퀵 정렬은 분할 정복(Divide and Conquer) 전략을 사용하는 정렬 알고리즘이다.중간 기준값(피벗)을 선택하여 작은 값은 왼쪽,
dev-jen.tistory.com
C# - 병합 정렬 (Merge Sort)
🧩 병합 정렬 (Merge Sort) – 항상 안정적인 분할 정복 정렬1. 개념병합 정렬은 분할 정복(Divide and Conquer) 알고리즘의 대표 예시이다.배열을 반으로 나누고, 나눈 배열을 각각 정렬한 후, 두 정렬된
dev-jen.tistory.com
C# - 정렬 알고리즘 비교 요약
🧠 정렬 알고리즘 비교 요약 & 선택 가이드✅ 1. 주요 정렬 알고리즘 비교표알고리즘평균 시간 복잡도최악 시간 복잡도공간 복잡도정렬 안정성특징선택 정렬O(n²)O(n²)O(1)❌ 불안정구조 단순, 교
dev-jen.tistory.com
C# - 탐색 알고리즘 정리 – 선형 탐색 vs 이진 탐색
🔍 탐색 알고리즘 정리 – 선형 탐색 vs 이진 탐색1. 탐색 알고리즘이란?탐색 알고리즘은 주어진 데이터에서 원하는 값을 찾는 알고리즘이다.정렬된 데이터든 아니든, 가장 기본이 되는 핵심 알
dev-jen.tistory.com
C# - 그래프 탐색 알고리즘 – DFS vs BFS
🌐 그래프 탐색 알고리즘 – DFS vs BFS1. 그래프 탐색이란?그래프 탐색 알고리즘은 노드와 간선으로 이루어진 구조에서 특정 노드까지 도달하거나 모든 노드를 방문하는 알고리즘이다.대표적으
dev-jen.tistory.com
C# - 다익스트라 알고리즘 (Dijkstra Algorithm)
🚀 다익스트라 알고리즘 (Dijkstra Algorithm)1. 개념다익스트라 알고리즘은 가중치가 있는 그래프에서 한 정점에서 다른 모든 정점까지의 최단 거리를 구하는 알고리즘이다.음수 간선이 없을 때 사
dev-jen.tistory.com
C# - 벨만-포드 알고리즘 (Bellman-Ford Algorithm) vs 다익스트라
🛤️ 벨만-포드 알고리즘 (Bellman-Ford Algorithm)1. 개념벨만-포드 알고리즘은 **음의 가중치(음수 간선)**가 있는 그래프에서도 단일 시작점으로부터 최단 거리를 구할 수 있는 알고리즘이다.시간 복
dev-jen.tistory.com
C# - 플로이드-워셜 알고리즘 (Floyd-Warshall)
🌉 플로이드-워셜 알고리즘 (Floyd-Warshall)1. 개념플로이드-워셜 알고리즘은 모든 노드 쌍 간의 최단 거리를 구하는 알고리즘이다.음수 간선이 있어도 동작하지만, 음수 사이클이 있으면 사용 불
dev-jen.tistory.com
C# - 알고리즘 핵심 개념 정리(DP, Greedy, Divide and Conquer, Backtracking, Union-Find, Disjoint Set, DFS, BFS)
1. 🧠 동적 계획법 (Dynamic Programming, DP)개념복잡한 문제를 작은 하위 문제로 나누어 풀고, 결과를 저장해 재사용조건: 최적 부분 구조, 중복 부분 문제구현 방식Top-down: 재귀 + 메모이제이션Bottom-up
dev-jen.tistory.com
오늘은 알고리즘 공부에 집중했다.
우선 시간 복잡도와 공간 복잡도의 개념부터 다시 정리했는데,
코드가 얼마나 오래 걸릴지, 얼마나 많은 메모리를 차지하는지를
Big-O 표기로 표현한다는 점을 다시 되짚었다.
그다음은 정렬 알고리즘들을 살펴봤다.
- 선택 정렬은 제일 작은 값을 찾아서 앞으로 보내는 방식이었고,
- 삽입 정렬은 앞에서부터 정렬된 상태를 유지하면서 새 값을 알맞은 위치에 "삽입"하는 구조였다.한 칸씩 왼쪽으로 이동하며 비교하기 위해서였다.
- 삽입 정렬의 while문 안에서 j-- 하는 이유도 알 수 있었다.
버블 정렬은 인접한 요소끼리 계속 비교해서 가장 큰 값을 뒤로 보내는 단순한 구조였고,
퀵 정렬과 병합 정렬은 분할 정복 기법을 활용해 효율적으로 정렬하는 고급 정렬 방식이었다.
정렬만큼 중요한 게 탐색이었다.
선형 탐색은 단순히 앞에서부터 찾는 방식,
이진 탐색은 정렬된 배열을 반으로 나누며 탐색하는 방식이었다.
또, DFS와 BFS는 그래프 탐색에서 자주 쓰이는 기본 알고리즘으로,
DFS는 깊이 우선, BFS는 너비 우선이라는 차이를 가졌다.
최단 경로 알고리즘도 정리했는데,
다익스트라는 우선순위 큐와 거리 배열을 활용해서 가장 짧은 경로를 찾고,
벨만-포드는 음수 간선이 있을 때도 사용할 수 있지만 시간이 오래 걸리는 알고리즘이었다.
문제 풀이도 여러 개 해봤다.
- 84번 히스토그램 문제에서는 스택을 이용해 최대 직사각형 넓이를 구했고,
- 733번 Flood Fill 문제는 DFS를 활용해서 같은 색 영역을 바꾸는 문제였다.
- 300번 LIS 문제에서는 DP를 활용해 가장 긴 증가 수열의 길이를 찾았다.
마지막으로 C#의 제네릭 컬렉션도 다시 정리했다.
List<int>는 단순 리스트고, List<int>[]는 리스트 배열,
List<(int, int)>은 튜플로 좌표나 쌍을 저장할 때 유용하다는 걸 배웠다.
사실 모든걸 이해하지는 못했지만 반복학습이 답일듯 싶다. 배울때 많이 배우고 복습 열심히하자!
🧩 학습하며 겪었던 문제점 & 에러
1. 문제정의: 삽입 정렬에서 j--의 동작이 직관적으로 이해되지 않았음
💻 관련 코드 예시:
for (int i = 1; i < arr.Length; i++)
{
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j--; // ❗ 이 부분이 왜 필요한지 헷갈림
}
arr[j + 1] = key;
}
- 시도:
- j--가 어떤 역할을 하는지 흐름을 직접 손코딩하며 추적함
- 해결방법:
- 정렬된 구간 안에서 값을 비교하면서 왼쪽으로 한 칸씩 이동한다는 구조를 시각화함
- 새롭게 알게 된 점:
- j--는 값을 한 칸 왼쪽으로 이동하면서 앞쪽 값과 계속 비교하기 위한 인덱스 조절임
- 다시 만나게 된다면:
- 반복문에서 인덱스 흐름이 복잡할 땐 직접 배열 상태를 표로 그려보며 흐름을 따라가자. 사실 내가 순간적으로 이해하지 못했었다.. 다시 천천히 보니 이해 확실!
2. 문제정의: 2차원 배열의 특정 값을 변수로 복사할 때 참조와 복사의 차이를 헷갈렸음
💻 관련 코드 예시:
int[,] image = {
{1, 1, 0},
{1, 1, 0},
{0, 0, 1}
};
int sr = 0, sc = 0;
int originalColor = image[sr, sc]; // ❗ 이 값이 원본과 어떻게 연결되는지 헷갈림
- 시도:
- originalColor를 수정해도 원본 배열이 바뀌는지 실험해봄
- 해결방법:
- int는 값 형식이라 복사되는 값이며, 배열의 참조가 아님을 확인
- 새롭게 알게 된 점:
- originalColor는 image 내부의 값을 복사한 독립된 값이므로 이후 원본과는 무관함
- 다시 만나게 된다면:
- 값 형식인지 참조 형식인지부터 먼저 따지고, 복사인지 연결인지를 구분하자
3. 문제정의: Longest Increasing Subsequence 문제 풀이에서 while문 흐름이 어려웠음
💻 관련 코드 예시:
List<int> dp = new List<int>();
foreach (int num in nums)
{
int left = 0, right = dp.Count;
while (left < right)
{
int mid = (left + right) / 2;
if (dp[mid] < num)
left = mid + 1;
else
right = mid;
}
if (left == dp.Count)
dp.Add(num);
else
dp[left] = num;
}
- 시도:
- while문 조건과 이진 탐색 흐름이 감이 안 와서 각 변수 변화 과정을 출력해봄
- 해결방법:
- 람다식, 컬렉션 등을 하나씩 분해해서 단계별로 해석하고, dp 리스트의 변화 과정을 직접 따라감
- 새롭게 알게 된 점:dp는 증가 수열을 시뮬레이션하는 용도임
- 이 방식은 실제 LIS를 구하는 게 아니라 길이와 패턴만 유지하는 방식이며,
- 다시 만나게 된다면:
- 복잡한 알고리즘일수록 흐름을 그대로 받아들이기보다, 데이터 변화 흐름을 눈으로 확인하는 게 중요함
📝 메모
오늘은 정말 많은 알고리즘들을 배우고 복습한 하루였다. 처음엔 삽입 정렬이나 LIS 문제처럼 익숙하지 않은 로직 앞에서 살짝 멍해졌지만, 그럴수록 흐름을 따라가고 손으로 써보면서 하나씩 내 걸로 만들었다. 특히 “왜 이 코드가 이렇게 작동하지?”라는 질문을 놓지 않았던 게 결국 이해로 이어졌다는 걸 느꼈다.
“모르는 걸 부끄러워하지 말고, 이해하려는 과정을 포기하지 말자.” 오늘도 이 말이 딱 내 하루였다.
혼란스러웠던 코드들을 곱씹고 정리하는 이 시간이 내 실력을 한 단계 올려주는 귀한 과정이라는 걸 잊지 말자. 오늘보다 조금 더 성장한 나로 다시 공부 시작하면 된다!!!오예!! 😊
'스파르타 코딩클럽 > TIL작성' 카테고리의 다른 글
| 내일배움캠프 12일차 TIL [예비군 훈련 + 팀프로젝트 퀘스트내용 개발] (0) | 2025.07.15 |
|---|---|
| 내일배움캠프 11일차 TIL [예비군 훈련 + 팀프로젝트 클래스 구조 설계] (0) | 2025.07.15 |
| 내일배움캠프 9일차 TIL [텍스트 RPG 개발] (0) | 2025.07.10 |
| 내일배움캠프 8일차 TIL [C# 고급 문법 정리 + 텍스트 RPG 제작 시작] (0) | 2025.07.09 |
| TIL - 내일배움캠프 7일차 TIL [C# 튜플과 LINQ로 배우는 컬렉션 활용 + Snake 게임 제작기] (2) | 2025.07.08 |