본문 바로가기

전체 글

(52)
앞으로의 백엔드 공부 계획 1. 코딩테스트 문제 익숙해지기 교육을 들으며 자료구조와 알고리즘의 개념은 거의 이해가 되었지만, 문제에 적용하기가 쉽지 않아서 코딩테스트를 볼 때 어려움을 겪고 있다. 그래도 맨 처음 코딩테스트를 봤을때와 지금을 비교하면 실력이 많이 늘은게 느껴진다. 문제를 푸는것에 익숙해지면 어려운 문제도 풀어나갈 수 있을거라 믿고 부족한 부분을 채워가며 꾸준히 공부할 것이다. 2. Java 개념 복습 자바 백엔드 개발자를 준비하면서 Java, Spring, DB, 서버, 코딩테스트 등 많은 것을 배우게 되지만 그 중에서 가장 중요한것은 Java라고 생각한다. 추후에 배울 예정인 Spring도 매우 중요하고 배우는 모든과목이 중요하지만, Java의 개념을 탄탄하게 쌓아놓아야 실력이 좋은 백엔드 개발자로 성장할 수 있..
[JAVA / 알고리즘] - 최소 신장 트리 최소 신장 트리 (MST : Minimum Spanning Tree) 그래프 상의 모든 노드들을 최소 비용으로 연결하는 방식의 알고리즘이다. ① 크루스칼 (Kruskal) 간선 중 최소 값을 가진 간선부터 연결하는 방식이다. 주로 간선 수가 적을 때 사용하며, 연결 도중에 사이클이 발생하면 다른 간선을 선택한다. 알고리즘 복잡도 : O (ElogE) - 사이클 발생 체크 Union - Find 배열 사용 (Union - Find : 노드 수에 맞춰서 자기 자신의 최종 부모노드가 무엇인지 나타내는 배열을 만들고 부모 노드가 2개 초과 할 경우 사이클 발생) ② 프림 (Prim) 임의의 노드에서 시작하는 방식이다. 연결된 노드들의 간선 중 낮은 가중치를 갖는 간선을 선택하며, 간선의 개수가 많을 때는 크루스..
[JAVA / 알고리즘] - 최단 경로 알고리즘 최단 경로 알고리즘 가중 그래프 상의 두 노드를 연결하는 가장 짧은 경로를 찾는 방법으로 지도 경로 탐색이나 네트워크 구축 시 비용을 최소화하는 경우 사용한다. ① 다익스트라 (Dijkstra) 출발점에서 목표점까지의 최단 경로를 구하는 알고리즘으로 하나의 노드에서 다른 모든 노드로의 최단 경로를 구할 수 있다. 그리디 + DP 형태의 구조이며 간선에 음의 가중치가 없어야한다. 알고리즘 복잡도 : O (ElogV) (E : 간선 수, V : 노드 수) ② 벨만-포드 (Bellman - Ford) 다익스트라와 다르게 음수 간선이 포함되어 있어도 최단 경로를 구할 수 있지만, 음수 사이클이 있으면 정상적으로 동작하지 않는다. 매번 모든 간선을 확인하기 때문에 다익스트라보다는 느리다. 따라서, 간선에 음수가 ..
[JAVA / 알고리즘] - 백트래킹 백트래킹 (Backtracking) 모든 경우의 수를 탐색하다가 최적의 경우가 아닌쪽은 더 이상 구하지 않는 방식 유망 (Promising) : 해가 될 가능성이 있는 경우 유망하다고 함 가지치기 (Pruning) : 해가 될 가능성이 없는 경우 해당 노드를 제외 백트래킹 (Backtracking) : 유망하지 않은 쪽으로 가지 않고 되돌아 오는 방식
[JAVA / 알고리즘] - 다이나믹 프로그래밍 다이나믹 프로그래밍 (DP) 큰 문제를 부분 문제로 나눈 다음 답을 찾아가는 과정에서, 계산된 결과를 기록하고 재활용하며 문제의 답을 구하는 방식으로, 중간 계산 결과를 기록하기 위한 메모리가 필요하지만 한 번 계산했던 부분은 다시 계산하지 않기에 연산 속도가 빠르다. 다른 알고리즘과의 차이 ① 분할 정복은 부분 문제가 중복되지 않고 독단적으로 사용되지만, DP는 부분 문제가 중복되어 계산 과정에서 재활용한다. ② 그리디 알고리즘은 계산 과정을 통해 최대한 근사치에 가까운 값을 도출하지만, DP는 모든 계산 방법을 확인 후 최적해를 구한다. DP 방법 ① 타뷸레이션 (Tabulation) 상향식 접근 방법으로 작은 하위 문제부터 풀면서 올라간다. 모든 과정을 계산하며 차례대로 진행 ② 메모이제이션 (Me..
[JAVA / 알고리즘] - 분할 정복 분할 정복 (Devide and Conquer) 큰 문제를 작은 부분 문제로 나누어 해결하는 방법 (합병 정렬, 퀵 정렬, 이진 검색, 등...) 분할 정복 과정은 다음과 같다. ① 문제를 하나 이상의 작은 부분들로 분할 ② 부분들을 각각 정복 ③ 부분들의 해답을 통합하여 원래 문제의 답을 구함 분할 정복은 문제를 나누어 처리하며 어려운 문제를 해결할 수 있고, 병렬처리를 하는데 이점이 있다는 장점이 있으며, 단점으로는 동일한 코드를 재귀적으로 호출하면서 진행하는 방식이기에 메모리를 많이 사용한다.
[JAVA / 알고리즘] - 그리디 알고리즘 그리디 알고리즘 (Greedy Algorithm) 매 순간 현재 기준으로 가장 좋은 답을 선택해 나가는 기법으로 근사치에 빠르게 접근할 수는 있지만, 결과적으로는 최적해가 아닐 수도 있다. 다만, 하기와 같은 조건일 때 그리디 알고리즘으로 최적해를 구할 수 있다. ① 탐욕적 선택 특성 (Greedy choice property) 지금 선택이 다음 선택에 있어서 영향을 주지 않는 경우 ② 최적 부분 구조 (Optimal substructure) 전체 문제의 최적해는 부분 문제의 최적해로 이루어지는 경우
[JAVA / 알고리즘] - 이진 탐색 이진 탐색 (Binary Search) 정렬된 상태의 데이터에서 특정 값을 빠르게 탐색하는 방식으로, 찾으려는 값과 중앙 값을비교하는 방식이다. 이때, 찾으려는 값이 중앙 값 보다 더 작으면 왼쪽부분에서 이진 탐색, 찾으려는 값이 중앙 값 보다 더 크면 오른쪽 부분에서 이진 탐색을 진행한다. 알고리즘 시간 복잡도 : O(logn)
[JAVA / 알고리즘] - 정렬 정렬 데이터를 원하는 기준으로 순서대로 배치하는 방법으로 구현 버블 정렬 (Bubble Sort) 인접한 데이터를 비교하면서 위치를 바꾸는 방식 알고리즘 복잡도 : O(n²) 삽입 정렬 (Insertion Sort) 앞의 데이터를 정렬하면서 삽입 위치를 찾아 정렬하는 방식 알고리즘 복잡도 : O(n²) 1번 인덱스부터 시작 앞쪽 데이터들이랑 비교해서 작으면 변경 선택 정렬 (Selection Sort) 최소 or 최대 값을 찾아서 가장 앞쪽이나 뒤쪽부터 정렬하는 방식 (최소값을 찾아서 가장 앞쪽부터 정렬 or 최대값을 찾아서 가장 뒤쪽부터 정렬) 알고리즘 복잡도 : O(n²) 합병 정렬 (Merge Sort) 배열을 계속해서 분할하여 길이가 1이 되도록 만들어주고, 인접한 부분끼리 정렬하면서 합병하는 방..
백엔드 커리어 로드맵 - 어떤 백엔드 개발자가 되고 싶은지 백엔드 개발자는 웹, 모바일 애플리케이션 분야의 플랫폼 서비스 구현, 데이터 관리 및 서비스 API 개발, 서비스 관리, 클라우드 콘솔 및 AWS 연동 시스템 개발 등 모든 서비스에 백엔드 분야가 있다고 생각해도 될 정도로 활용범위가 매우 넓다. 그중에서, 나는 개발자로 실력을 쌓아놓고 추후에 DevOps 쪽으로 커리어를 이어나가려는 계획을 가지고 있다. 공부를 하면서 계획이 바뀔수도 있지만, 우선 성실하게 교육을 들으며 다양한 프로젝트를 경험하고 나에게 가장 적성에 맞는 기술 스택을 중점으로 내 실력을 쌓아나갈 것이다. 그리고, 기술을 배우는 것이 매우 중요하지만 그만큼 중요한 것이 코드 관리를 잘하는 것이라고 생각한다. 지금은 혼자 코딩을 하고 있어서 변수 이름을 대충 짓거나 들여 쓰기 같은 것이 잘..