
문제 www.acmicpc.net/problem/2398 알고리즘 Dijkstra 풀이 세명이 통화를 하기 위해 간선들을 연결하기 위한 최소비용, 그 때 사용하는 간선들을 출력하는 문제입니다. 사람들이 그래프 위에서 움직여 최적의 장소에서 모이는 문제로 해석해보겠습니다. 각 사람마다 각 노드마다의 최소거리를 알 수 있다면 즉, 한 지점마다 세 사람의 최소거리를 안다면 우리는 어디 지점에서 세 사람이 만나야 하는지 알 수 있습니다. 사람마다 다익스트라를 돌려 총 세번의 다익스트라를 수행하고 그때마다 그 사람이 어디 노드에서 어디 노드로 갔는지를 기록하면 됩니다. 코드 #include #define rep(i, n) for (int i = 0; i < n; ++i) #define REP(i, n) for (..

문제 www.acmicpc.net/problem/4716 알고리즘 greedy 풀이 방 A, B에 풍선이 있고 각 팀마다 방마다의 거리와 얻을 풍선수가 주어질 때 최소로 이동하는 거리를 구하는 문제입니다. 이 문제의 답을 가장 방해(?)하는 것은 방과의 거리가 먼 팀입니다. 답을 최소로 만들어야하는데 먼 거리를 통해 해당 팀에 풍선을 전달하면 답을 찾기가 어려워집니다. 입력 예제에서 3번팀은 각 방과의 거리가 40과 10입니다. 거리가 10인 방을 이용해서 풍선을 전달해야 거리가 40인 방의 풍선을 전달받지 않아 최소로 답을 구할 수 있을 것입니다. 그렇다면 우선적으로 고려해야할 것은 방과의 거리가 먼 팀일까요? 비슷하긴 하지만 답은 아닙니다. A방에서 가져올 풍선을 B방을 선택해서 이득을 보거나 B방에..

문제 www.acmicpc.net/problem/17493 알고리즘 DFS 풀이 포레스트에서 트리의 지배집합의 수를 찾는 문제입니다. 동아리의 홍보효과가 인접한 지역까지 영향을 미칩니다. 하나의 트리에서 문제를 살펴보겠습니다. 잘 생각해보면 리프노드에는 굳이 홍보를 할 이유가 없습니다. 리프노드에 홍보를 하면 자신의 부모노드에만 영향을 미치지만 그 부모노드에 홍보를 하게 되면 리프노드뿐만 아니라 그 부모가 갖는 자식들에게 모두 홍보를 할 수 있기 때문입니다. 즉 리프노드의 부모노드는 무조건 홍보를 해야 이득임을 알 수 있습니다. [잘못된 풀이] 처음에 이 문제를 리프노드의 부모로부터 BFS를 수행해 현재 노드가 빨간 노드(홍보노드)면 주변은 노 란노드(영향을 받는 노드), 현재 노드가 노란 노드면 주변을..

문제 www.acmicpc.net/problem/1445 알고리즘 다익스트라 풀이 쓰레기와 쓰레기 근처를 최소로 하여 도착지까지 도착해야하는 문제입니다. 다익스트라에서 사용하는 dist배열을 pair형태로 사용합니다. first와 second는 각각 지나간 쓰레기와 쓰레기 근처를 지나간 횟수를 의미합니다. pair값들의 비교를 위해 comp를 함수를 작성했습니다. 다른 부분은 일반적인 다익스트라와 동일합니다. 코드 #include #define rep(i, n) for (int i = 0; i M; rep(i, N) rep(j, M) { char x; cin >> x; if (x == 'g') { board[i]..

문제 www.acmicpc.net/problem/2276 알고리즘 다익스트라 풀이 NXM 격자판에 표면의 높이들이 주어질 때, 채울 수 있는 최대 물의 높이를 구하는 문제입니다. 격자판의 밖에서 격자판으로 물이 스며가는 형태로 구현을 했습니다. 즉 다익스트라의 시작점은 격자판의 테두리 부분이고 도착점은 테두리를 제외한 칸이라고 생각할 수 있습니다. 다익스트라는 하나의 시작점으로부터 하나의 도착지를 구하는 알고리즘이라 이를 적용하려면 약간의 테크닉을 써야합니다. A개의 시작점과 B개의 도착점이 주어졌다면, A개의 시작점들의 조상 시작점과 B개의 도착점들의 조상 도착점을 하나씩 만드는 것입니다. 아래코드에서는 각각 i*j, i*j+1로 사용하였습니다. 그리고 모든 격자판을 연결하는데, 높이가 높은 ..

문제 www.acmicpc.net/problem/21234 알고리즘 스위핑 풀이 N * N 사각형안에 값들이 주어집니다. 부분 직사각형안에 최솟값이 100이 될 수 있는 직사각형의 갯수를 구하는 문제입니다. 사각형을 결정하기 위해선 상하좌우의 변이 필요합니다. 다르게 말하자면 브루트포스로 해결하기 위해선 O(N4)의 시간복잡도가 필요하므로 시간초과입니다. 한 직사각형의 위와 왼쪽변을 결정했다고 가정하겠습니다. 이 변들을 포함하며 최솟값이 100이 되는 직사각형들을 찾기 위해서는 왼쪽변보다 오른쪽에 위치한 변들을 살피며 그때 아래변들을 살펴보면 됩니다. 이 과정은 위에서 언급한대로 O(N4)의 시간복잡도를 필요하지만 아래변들을 살필 때 우리가 찾는 것은 가장 높은 100의 위치(A)와 포함해서는..

문제 www.acmicpc.net/problem/21233 알고리즘 greedy 풀이 12의 배수에 해당하는 연도에 포탈이 열립니다. 모든 선조들을 만나고 돌아올 때, 걸리는 가장 짧은 시간을 구하는 문제입니다. 포탈은 최대 K번 이용할 수 있습니다. 전형적인 그리디 문제입니다. 포탈을 사용해서 건너뛰어야하는 구간은 연도차이가 가장 큰 구간입니다. 각 선조들의 연도를 거쳐야만 하는 연도(12의 배수중 하나)로 바꿉니다. 예를 들어 35년 전에 존재하는 선조는 36년도 전에 열리는 포탈을 거쳐야만 (또는 더 이전의 포탈에서 시간이 흘러야만) 올 수 있습니다. 거쳐야하는 포탈을 골랐다면 각 포탈의 차이(A포탈의 시작과 B 포탈의 끝)를 담는 벡터를 만든 후, 정렬해서 가장 큰 것부터 K−1개를 제외해..

문제 www.acmicpc.net/problem/21232 알고리즘 queue 풀이 N마리의 소가 차례대로 목장에 추가가 됩니다. 소의 주변에 3마리의 소가 있으면 소는 Comfortable한 상태로 됩니다. 이 상태에선 우유생산을 제대로 하지 못하므로 새로운 소를 추가해서 이를 방지하려 합니다. 이때 새로이 추가해야하는 소의 마릿수를 정해진 소를 추가할때마다 구하는 문제입니다. adj[i][j]는 (i,j)에 살고 있는 소의 인접한 소의 마릿수를 나타내는 배열입니다. 정해진 소를 추가할때마다 영향을 미치는 좌표는 해당 소의 상하좌우에 있는 좌표입니다. 영향을 받는 좌표들이 있다면 해당 좌표들의 adj값이 3인지 확인해주고 3이라면 큐에 넣어줍니다. 큐는 comfortable한 상태들의 ..
- Total
- Today
- Yesterday
- 이분탐색
- string
- Oracle
- 스위핑
- 트라이
- 정렬
- Fenwick
- union find
- 2-SAT
- spring
- knapsack
- kmp
- sorting
- spring boot
- DP
- bfs
- greedy
- 좌표압축
- dfs
- Suffix Array
- 동적계획법
- sweeping
- dijkstra
- 이분매칭
- 펜윅트리
- implementation
- 세그먼트트리
- Segment tree
- SCC
- hld
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |