전체 글 22

IoC & DI

IoC IoC는 Inversion of Control, 즉 제어의 역전이다. 기존의 프로그래밍 방식에서는 개발자가 프로그램의 제어 흐름을 직접 제어한다. 예를 들어, 객체를 생성하고 의존성을 해결하는 등의 작업은 개발자가 직접 수행한다. IOC에서는 제어 흐름의 일부가 라이브러리나 프레임워크에 의해 제어된다. 즉, 개발자는 제어의 흐름을 역전시킨다. IOC는 객체의 생성, 생명주기 관리, 의존성 해결 등을 담당한다. 제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말한다. 이전과는 다르게 클래스 B 객체를 직접 생성하는 것이 아니므로, 어딘가에서 받아와서 사용한다. 이처럼 제어의 역전을 적용하면 객체를 외부에서 관리하게 되고, 실제로 사용할 ..

스프링 2024.02.25

알고리즘 - 그리디

오늘은 그리디 알고리즘을 공부했다. 그런데 딱히 알고리즘이라 하긴 어려웠다. 그저 정렬해서 값을 찾는것이고 고려사항이 많기에 유용하다곤 생각이 안들었다. 그리디 알고리즘 (Greedy algorithm) 또는 탐욕 알고리즘 각 단계에서 최선의 선택을 하는 방식으로 문제를 해결하는 알고리즘 → 바꿔 말하면, 각 단계에서 최선의 선택(부분 문제의 최적해)을 모두 합쳤을 때,전체에서의 최선의 선택과 다르다면 풀이가 성립하지 않는다. 오늘은 바로 문제로 넘어간다. 1번 문제 - BOJ 11399 ATM 11399번: ATM 첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000) www.acmicpc.ne..

카테고리 없음 2024.02.23

알고리즘 - 정렬

오늘은 2가지를 배웠다. 하나는 깃에 내가 푼 백준문제와 리트코드를 커밋하는것과 정렬이다. 내가 푼 문제를 시간 쓰지 않고 커밋할수 있다는 점이 유요했다. 오늘 배운 알고리즘은 정렬이다. 펴소 정렬은 그냥 sort()나 sorted로 했었는데 그건 배열정렬이었고 그 이외나 내장함수를 사용하지 못한경우 다른 정렬방법을 사용해야한다. 1. 버블 정렬(Bubblesort) 버블 정렬은 첫 번째 자료와 두 번째 자료를, 두 번째 자료와 세 번째 자료를, 세 번째와 네 번째를, … 이런 식으로 (마지막-1)번째 자료와 마지막 자료를 비교하여 교환하면서 자료를 정렬하는 방식. 작은 숫자, 큰 숫자 순서로 있으면 내버려두고 큰 숫자, 작은 숫자 순서로 있으면 둘의 위치를 변경하시면 된다 2. 선택 정렬(Selecti..

카테고리 없음 2024.02.22

알고리즘 - 최소신장트리(MST)

오늘 부터는 날짜가 아니라 주제를 제목으로 하려고 한다. 왜냐하면 날짜가 제목이어서 헷갈리거나 생각이 잘 안나는 내용들을 찾기가 좀 어려웠다... 오늘 배운건 최소신장 트리이다. 최소 신장 트리(Minimum Spanning Tree, MST)란? 최소 스패닝 트리 라고도 많이 불린다. 주어진 그래프의 모든 정점을 지나면서, 간선의 가중치 합이 최소가 되는 트리 그래프의 모든 정점을 포함하고 그래프의 일부 간선을 포함하며 사이클이 없는 (트리의 특징) 위 특징을 가진 서브 그래프 중 간선의 가중치 합이 최소인 트리 원본 그래프 간선에 가중치가 부여되어 있음 간선의 방향 여부에 따라 구하는 방법이 달라짐 코딩테스트에서는 간선의 방향이 없는, 무방향 그래프에 대해서만 나온다 정점이 n 개인 그래프의 최소 신..

알고리즘 2024.02.19

알고리즘 day 6 & 7

오늘은 이틀에 걸쳐 dfs,bfs를 배웠기에 한꺼번에 정리 하기로 한다. dFS DFS는 Depth First Search로 갈 수 있는 만큼 계속해서 탐색하다가 갈 수 없게 되면 다른 방향으로 다시 탐색하는 구조다. - 노드를 방문하고 깊이 우선으로 인접한 노드를 방문한다. - 또 그 노드를 방문해서 깊이 우선으로 인접한 노드를 방문한다. - 위 과정을 반복한다. BFS 우선 DFS 와 BFS 의 차이점을 살펴보자 DFS 는 탐색하는 원소를 최대한 깊게 따라가야 한다. 이를 구현하기 위해 인접한 노드 중 방문하지 않은 모든 노드들을 저장해두고, 가장 마지막에 넣은 노드를 꺼내서 탐색하면 된다. → 그래서 스택을 사용! BFS 는 현재 인접한 노드 먼저 방문해야 한다. 이걸 다시 말하면 인접한 노드 중 ..

알고리즘 2024.02.16

알고리즘 day 5 & test

이번엔 연결리스트에 대해 공부했다. 연결리스트는 코딩테스트 보다는 개념이 더중요하기에 면접에서 주로 쓰인다고 들었다. 힙영역에 저장된 리스트를 포인터를 이동해서 찾는다는게 생각보다 까다로웠다. 오늘 배운것의 핵심은 Array List와 Linked List의 차이점이라고 생각한다. 어레이 리스트(Array List) 데이터 검색이 잦은 경우 적합한 리스트 특징 배열의 크기를 동적으로 할당 인덱스를 활용해 데이터에 빠른 접근 배열 끝부분을 제외한 위치의 데이터 삽입 삭제 시 데이터의 복사 이동이 많아 시간이 많이 걸림 ​ ​ 링크드 리스트(Linked List) 데이터 삽입 삭제가 잦은 경우 적합한 리스트 특징 ArrayList의 단점을보완하기 위해 나옴 노드와 노드가 연결된 구조기 때문에 메모리 측면에서..

알고리즘 2024.02.14

일주일간의 회고

주중에는 알고리즘 공부를 하고 연휴에는 자바를 다시 봤다. 꽤 오래만에 자바를 봤지만 몸이 기억하는건지 크게 어려움을 느끼지 않아 다행이라 생각했다. 다만 주중에 했던 알고리즘을 다시 한번 봤는데 그때 푼 문제도 다시봐도 어려웠던 것들도 몇가지 있었다. 주로 투 포인터 알고리즘 등 2개의 포인터를 이용하여 푸는 문제들이 어려웠던것 같다. 다음주에는 테스트가 예정되어 있다. 물론 어렵고 문제를 봤을때 당황스럽겠지만 조금이라도 덜 당황하도록 또 다시한번 공부를 해야겠다. 이러한 과정이 반복되면 내것이 된다고 믿는다.

알고리즘 2024.02.11

알고리즘 day4

오늘은 힙에 대해 공부했다 이진 트리와 완전 이진 트리에 대한 개념을 먼저 공부하고 문제를 풀었는데 오늘은 특히 큰 어려움이 없었다. 다만 코치님이 추가로 생각해보란게 몇개 있었는데 그것에 대해 설명과 링크를 추가한다. Redis : I/O를 줄이기 위해, 즉 디스크 부하를 줄이기 위해 많이 사용한다. https://seokhyun2.tistory.com/63 [Redis] Redis란? & Redis 사용방법 0. 개요 서비스를 개발하다보면, 서비스 속도가 종종 문제를 일으킵니다. 그래서 속도를 높이기 위해 다양한 방법을 활용하는데, 그 중에 오늘은 Redis를 활용하는 방법을 알아보고자 합니다. 일 seokhyun2.tistory.com Query DSL: Elasticsearch와 같은 검색 엔진에..

알고리즘 2024.02.08

알고리즘 day3

오늘은 해시테이블에 대해 배웠다. 처음 강의만 보고는 잘 이해가 안되서 유튜브 영상을 추가로 학습했다. https://www.youtube.com/watch?v=ZBu_slSH5Sk 문제를 풀면서 sorted() 함수의 매개변수에 대해 알게 되었다. iterable (반복 가능한 객체): 정렬하고자 하는 요소들이 담긴 iterable 객체이다. 주로 리스트나 튜플 등을 사용한다. key (정렬 기준 함수): 정렬 기준을 지정하는 함수이다. 기본값은 None이며, 이 경우 요소 자체를 비교하여 정렬한다. 사용자가 직접 정렬 기준을 지정하려면 이 매개변수를 사용한다. reverse (정렬 순서): 정렬 순서를 지정하는 매개변수로, 기본값은 False이다. True로 설정하면 내림차순으로 정렬된다. key와 ..

알고리즘 2024.02.07

알고리즘 day2

오늘 공부한 것은 스택/큐/데크다. 스택은 First In Last Out 방식이고 큐는 반대로 First In First Out 방식이다. 그리고 데크는 스택 + 큐의 개념이다. 양쪽에서 삭제와 삽입이 처리가 가능한 형태 deque = doubled ended queue Python의 경우, collections.deque 가 지원된다. 꼭 알아야 할 함수 - deque() , append() , appendleft() , pop() , popleft() from collections import deque deck = deque() # 신규 데크 생성 ([]) deck.append(1) # 오른쪽 끝에 1을 삽입 ([1]) deck.appendleft(2) # 왼쪽 끝에 2를 삽입 ([2, 1]) d..

알고리즘 2024.02.06