All-round developer/Computer Science 9

[알고리즘] 정렬 시리즈 1탄: 선택 정렬, 삽입 정렬, 퀵 정렬, 계수 정렬

0. Introduction가장 기본이 되는 4가지 정렬 기법인 선택 정렬, 삽입 정렬, 퀵 정렬, 계수 정렬에 대해서 정리해 보았다.이 정렬 기법들이 가장 좋다고 볼 순 없지만, 구현이 간단하거나 경우에 따라 가장 효율적이기 때문에 많이 쓰이는 방법들이다. 각각의 정렬 기법들은 이름을 보면 어떻게 동작하는지 힌트를 얻을 수 있다. 하나씩 자세히 살펴보자.참고로 아래 예시는 작은 값부터 점차 큰 값으로 정렬하는 오름차순 정렬을 기준으로 설명하고 있다. 1. 선택 정렬 (Selection Sort) 1-1. 선택 정렬의 특징선택 정렬은 리스트를 돌면서 가장 작은 요소를 선택하여 맨 앞으로 가져온다. 1-2. 선택 정렬 동작 과정따라서 위 이미지를 보았을 때, Step 1 에서는 5번 인덱스(여섯번째 값)..

[알고리즘] 동적 계획법 (Dynamic Programming) + 메모이제이션(Memoization)

1. 소개동적 계획법은 해결하려는 문제를 작은 단위로 쪼개어 접근하는 방식이다. 사전 계산된 값을 여러 번 재활용할 때 효율적이다.(DP를 정의할 때 '문제를 쪼개는 것'에 초점을 맞추는 것이 DP 이해에 방해가 된다고 판단하여 아래 내용으로 수정합니다.) 동적 계획법은 연산 속도를 개선하기 위해 문제를 재설계하는 기법이다.사전에 계산된 값을 재연산 하지 않기 위하여 결과를 저장해둔다. 이를 위해 적절한 단위로 문제를 쪼개는 것이다.즉, 동적 계획법에서 중요한 포인트는 문제를 쪼개는 것이 아니라, 연산이 여러 번 되는 것을 막기 위하여 문제를 재설계하는 것이다.이 과정에서 메모리를 활용하거나 더 작은 단위의 문제로 쪼개어지는 과정이 필요할 수도 있다. (2025.04.28 수정) 나무위키에 와닿는 정의가..

[응용] DFS와 2차원 배열 내 영역의 최대 개수 구하기

1. 개요DFS 알고리즘을 적용한 문제 유형으로 2차원 배열에 포함된 특정 영역의 최대 개수를 구하는 문제가 많이 출제된다.아래 두 문제를 풀어보며 이러한 문제 유형에 대해 이해하게 되어, 그 내용을 정리해보려고 한다. 이 글에서는 내가 이해한 개념을 자세하게 풀어서 정리하고, 관련 문제의 코드도 함께 살펴 볼 예정이다.  단, 이 글은 DFS 알고리즘에 대해 이해하고 있다는 가정 하에 설명을 진행한다.만약 DFS 알고리즘의 개념이나 원리를 잘 모른다면 아래 글을 참고하기를 추천한다.https://developer-zoyh.tistory.com/17 [알고리즘] DFS(Depth-First Search)와 BFS(Breadth-First Search)0. IntroductionDFS와 BFS를 별도 게시..

[알고리즘] DFS(Depth-First Search)와 BFS(Breadth-First Search)

0. IntroductionDFS와 BFS를 별도 게시물로 정리하려고 했으나 결국 하나의 게시물로 정리하게 되었다.둘은 이름이 비슷해서인지 잘 헷갈리는 것 같다.같은 게시물 안에서 동일한 그래프로 비교하면서 보면 더 잘 이해할 수 있을 것이라고 판단하였다.단, BFS, DFS 문제풀이는 본 게시물에서 다루지 않는다. 앞으로 DFS, BFS 문제를 공부하면서 차근차근 하나씩 추가해보겠다. 1. DFS (Depth-First Search, 깊이 우선 탐색)1. 정의이름에서 알려주는 것처럼 깊이를 우선적으로, 즉, 가장 깊이 위치하는 노드까지 탐색하는 알고리즘이다.DFS 문제를 풀 때는 스택을 활용하면 더 쉽게 해결할 수 있다.이것은 예시를 보면 더욱 잘 이해할 수 있으니 예시를 함께 보면서 확인하도록 하자...

[자료구조] 그래프(Graph)와 탐색(Search)

🌱 그래프 그래프는 노드와 간선으로 이루어진 자료 구조이다. 크게 노드와 엣지(간선)으로 구성되어 있다.그래프는 간선으로 연결된 노드들 간 이동할 수 있는데, 이렇게 간선으로 연결된 노드들을 인접하다(Adjacent)고 한다.  🌱 그래프 표현 방법그래프에서 인접한 노드들간의 관계를 나타내는 방법으로 크게 인접 행렬(Adjacency matrix)과 인접 리스트(adjacency list)가 있다.1. 인접 행렬인접 행렬은 단어 그대로 "행렬"의 형태로 인접한 노드 간의 관계를 나타낸 것을 의미한다.행의 노드와 열의 노드 간의 거리를 행렬값으로 확인할 수 있다. 따라서 인접한 노드 조회를 할 때 시간 측면에서 O(1)로 아주 빠르다.그러나 이 방식은 메모리 측면에서 비효율성을 야기할 수 있기에 조심해..

[자료구조] 스택(stack)과 큐(queue)

🌱 스택 (Stack)1. 기본 개념스택은 기본적으로 LIFO(Last In First Out), 혹은 선입후출 구조라고 한다. 즉, 나중에 들어간 것이 맨 처음 나온다. 다시 말 하면 처음 들어간 것이 맨 뒤에 나오는 구조이다. 동굴을 떠올리면 스택 구조를 쉽게 상상할 수 있다.2. 이상 상태스택은 고정된 크기를 갖는 자료구조이다. 따라서 고정된 크기에서 벗어나는 액션을 취할 때 두 가지 이상 상태를 가질 수 있다.1. 오버플로우(Overflow): 자료구조가 수용 가능한 범위를 가득 채운 상태해서, 초과하여 삽입 연산을 수행하려고 할 때 발생하는 현상2. 언더플로우(Underflow): 자료구조에 데이터가 들어 있지 않은 상태에서 삭제 연산을 수행하려고 할 때 발생하는 현상* 예전에는 위 두 용어가..

[알고리즘] 구현(Implementation)

정의: 넓게는 알고리즘을 소스 코드로 바꾸는 것을 의미한다. 좁게는 문제에서 제시하는 제약 조건들에 대해 문법 및 라이브러리를 활용하여 꼼꼼하게 풀어내는 것을 의미한다.대표 예시- 완전 탐색: 문제에서 나올 수 있는 모든 경우의 수에 대해 계산하는 문제 유형- 시뮬레이션: 문제를 해결하기 위하여 각 절차를 한 단계씩 순차적으로 해결해나가는 문제 유형주의사항: 입력 조건이 자세하게 명시되며 문제의 길이가 긴 편이다.참고: 파이썬은 C, C++, JAVA에 비해 난이도가 낮은 반면 속도가 느리다는 단점이 있다. 이를 개선하기 위해 코딩 테스트 시 개발 환경에 PyPy를 지원한다면 PyPy를 선택하자. (실행 속도가 더 빠름)

[알고리즘] 단순 무식한 그리디(Greedy) 알고리즘

정의: 매 시점에 가장 좋은 선택지를 고르는 방식으로, 현재의 선택이 미래에 미칠 영향을 고려하지 않는 알고리즘이다.* 욕심쟁이 알고리즘 혹은 탐욕법이라고도 불린다.필요 역량: 창의력 / 문제를 풀기 위한 아이디어를 떠올릴 수 있는 능력특이 사항: 문제에서 기준이 제시될 가능성이 높으며 정렬 알고리즘과 함께 사용되는 경우가 많다.주의 사항: 그리디 알고리즘을 적용한 해법이 정당한지 검토하는 과정 필요 (반례 탐색 등)

[개념] 복잡도(Complexity)

이미지 출처: https://www.scholarhat.com/tutorial/datastructures/complexity-analysis-of-data-structures-and-algorithms 정의: 알고리즘의 성능을 나타내는 척도종류: 시간 복잡도, 공간(메모리) 복잡도* 일반적으로 복잡도라고 하면 시간 복잡도를 의미한다.표기 방법: 빅오 표기법* 빅오(Big-O) 표기법이란, 구현한 알고리즘을 시간 혹은 메모리에 대한 함수로 나타낸 후, 그 함수의 상한만을 고려한 표기방식이다.주의 사항: 소스 코드를 정확히 분석하여 복잡도를 계산하여야 한다. 만약 내부적으로 함수를 호출한다면 내부 함수도 복잡도를 계산해주어야 한다.코딩 테스트 시 제한 기준 (일반적인 상황)- 시간 복잡도: 1초, O(N^3..

728x90