분류 전체보기

스프링의 IoC컨테이너는 Bean을 관리한다. 의존성을 관리해주고 객체들을 싱글톤으로 관리해주며 이번에 설명할 Bean의 생성과 소멸까지의 Lifecycle을 관리하는 역할 또한 가지고 있다. Spring Bean의 Life Cycle은 간단하게 보면 "객체 생성 > 의존관계 주입" 순서로 이루어진다. 그렇기 때문에 의존관계 주입이 다 끝난 이후에야 우리가 사용할 테이터에 값이 채워지며 전 초기화 단계에서는 null인 상태로 존재한다. 1. Spring Bean의 Lifecycle 1. 스프링 IoC 컨테이너 생성 2. Bean 생성 : IoC컨테이너는 컴포넌트 스캔을 통해 빈을 찾아서 등록한다(@Component, @Bean.. 등). 이 과정에서 기본 생성자를 호출하여 객체를 만든다. // 생성자 주..
https://www.acmicpc.net/problem/1937 1937번: 욕심쟁이 판다 n × n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에 www.acmicpc.net 1. Logic dp배열의 의미 : 해당 좌표를 통해 먹을 수 있는 대나무의 최대 갯수 2. Code #include using namespace std; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, -1, 0, 1}; int n; int bamboo[501][501]; bool vis[501][501]; int dp[501][501]; int dfs(i..
1. 동기화 문제란? 여러 프로세스 또는 여러 스레드가 동시에 실행될 때 발생하는 데이터 일관성 문제를 동기화 문제라고 한다. 대표적으로 공유 메모리에 여러 스레드가 동시에 접근해서 값을 변경할 때 연산 결과 출력이 예상치 못한 값으로 나오는 공유 메모리 동기화 문제(Race condition)를 대표적인 동기화 문제로 볼 수 있다. 2. Race Condition / 경쟁 상태 여러개의 프로세스 또는 스레드가 하나의 공유 자원에 동시에 접근할 때 생기는 문제를 말한다. 아래 코드를 보면 스레드 두개를 선언하고 전역으로 선언한 sum이라는 변수에 스레드 두개가 동시에 접근하여 sum이라는 전역 변수에 값을 1씩 증가시키는 코드이다. 뇌버깅을 돌려보면 두개의 스레드에서 1씩 30000번씩 증가시키기 때문에..
https://www.acmicpc.net/problem/1446 1446번: 지름길 첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이 www.acmicpc.net 1. Logic 문제를 보자마자 직관적으로 같은 지점을 지나가야하는 중복 문제가 보여서 DP로 접근했다. 2. Code #include using namespace std; int n, d; vector arr[10001]; int dp[10001]; int solve(int location) { if(location == d) return 0; int &ret = dp[location..
1. Quick sort 분할 정복 테크닉을 사용한 매우 빠른 시간 복잡도를 가진 정렬 알고리즘이다. 정렬 로직 수행 간 초기 정렬 상태를 보장하지 않는 불안정 정렬이다. 추가 메모리 공간을 필요로 하지 않는다. 시간 복잡도 : O(NlogN) Quick sort의 로직 동작 과정 주어진 배열의 범위 내에서 하나의 값(Pivot)을 기준으로 정하고, pivot 왼쪽에는 pivot보다 작은 값들이 오른쪽에는 pivot보다 큰 값들이 오도록 정렬한다. pivot을 기준으로 나뉜 배열은 정렬된 순서는 보장하지 않기 때문에 각각 배열에서 새로운 pivot을 설정하여 다시 분할해서 재귀 호출 한다. 1,2번의 과정을 배열을 분할할 수 없을 때 까지 반복한다. Quick sort 장/단점 장점 - pivot과 거리..
https://www.acmicpc.net/problem/2665 2665번: 미로만들기 첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고, 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다. 0은 검은 방, 1은 흰 방을 나타낸다. www.acmicpc.net 1. Logic vis 배열에 해당 좌표까지 오는데 바꾼 최소 방의 갯수를 저장하면서 다익스트라와 비슷한 방식으로 풀이해주면 된다 2. Code #include using namespace std; int n; int graph[51][51]; int vis[51][51]; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, -1, 0, 1}; void bfs() { qu..
1. Merge sort 분할 정복기법을 활용하여 정렬시키는 정렬 알고리즘이다. 재귀를 활용하여 큰 문제를 작은 문제로 쪼개서 풀이한 다음 return하면서 값을 합쳐서 도출해낸다. 정렬 로직 수행 간 초기 정렬상태를 보장하는 안정 정렬 방식이다 시간복잡도 : O(NlogN) // 공간복잡도 : O(N) Merge sort의 로직 동작 과정 1. 정렬할 배열의 처음과 끝 인덱스를 함수의 인자로 넘겨준다. 2. 처음과 끝 인덱스를 2로 나눈, 즉 mid = (left + right)/2. mid를 기준으로 재귀함수를 호출하여 범위가 1이 될 때 까지 나눠준다. 3. 정렬한 후 값을 복사해서 return 한다. mid를 기준으로 나눴을 때 왼쪽 부분의 범위 : left~mid mid를 기준으로 나눴을 때 오..
1-1. Bubble sort / 버블 정렬 인접한 두 원소를 비교해서 정렬이 잘못되어 있으면 서로 바꾸는 방식으로 정렬한다. 한번 큰 for문을 돌 때마다 탐색 범위 중에서 가장 큰 값을 가지는 원소가 뒤로 이동한다(오름차순 정렬일 경우) 돌 때마다 큰 숫자 하나는 무조건 정렬되기 때문에 (전체 원소의 갯수 - 큰 for문을 돈 횟수)만큼 돌아주면 된다. 시간복잡도 : O(N^2) 1-2. Code #include using namespace std; int n; vector arr; void Print() { for (int a : arr) { cout
https://www.acmicpc.net/problem/17070 17070번: 파이프 옮기기 1 유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 www.acmicpc.net 1. Logic 같은 위치에 파이프가 위치할 수 있기 때문에 중복 문제가 생기므로 DP를 사용해서 풀이했다. 이 문제에서 주의할 점은 지문에서 "꼭 빈 칸이어야 하는 곳은 색으로 표시되어져 있다." 라는 문장을 잘 읽어야한다. 가로와 세로는 단지 가는 가는 곳만 벽이 아니면 되지만, 대각선 파이프는 옮기는 지점에서 왼쪽, 위쪽이 비어있어야 한다. 이 부분만 잘 짚고 넘어가..
https://www.acmicpc.net/problem/9328 9328번: 열쇠 상근이는 1층 빌딩에 침입해 매우 중요한 문서를 훔쳐오려고 한다. 상근이가 가지고 있는 평면도에는 문서의 위치가 모두 나타나 있다. 빌딩의 문은 모두 잠겨있기 때문에, 문을 열려면 열쇠가 www.acmicpc.net 1. Logic 방에 들어갈 때 .이나 $이면 들어갈 수 있기 때문에 방 주변을 이동 가능한 공간으로 둘러싸서 입구를 찾아준다. BFS함수 안에서 각 열쇠마다 키가 없을 때 방문했던 좌표를 queue에 저장해놓고 키를 찾으면 queue에서 뽑았던 좌표를 빼서 확인해준다. 아이디어가 신박했다. 2. Code #include using namespace std; int dx[4] = {-1, 0, 1, 0}; i..
보글보글소다
'분류 전체보기' 카테고리의 글 목록 (5 Page)