| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 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 | 31 |
- FOR ALL ENTRIES IN
- CTS #CTS ์ด๊ด #SAP #ABAP
- DP - ๋ฌดํ๋ฐฐ๋ญ(์์)
- APPENDING
- APPENDING CORRESPONDING
- DP - ์ ํ๋ฐฐ๋ญ
- qfieldname
- SAP GUI
- ALV Output Setting
- using value
- transporting
- MONAT_F4
- DP - ๋ฌดํ๋ฐฐ๋ญ
- boole_d
- java
- SM36
- ZPL
- READ TABLE
- SAP
- Union-Find
- ๋ ์ง ๊ณ์ฐ ํจ์
- NEW-PAGE PRINT ON
- ABAP
- batch job
- Data Browser
- Dictionary Search Help
- cfieldname
- BOJ_Gold
- changing value
- ํ๋์นดํ๋ก๊ทธ
- Today
- Total
Jin's Library
ํ ํ๋ฆฟ ์๊ณ ๋ฆฌ์ฆ ๋ณธ๋ฌธ
๐งฉ ํ ํ๋ฆฟ์ผ๋ก ์ธ์๋๋ฉด ์ฝํ ·๋ฐฑ์ค์์ ๋ฌด์ ์ด ๋๋ ์๊ณ ๋ฆฌ์ฆ๋ค
- DFS (์ฌ๊ท / ์คํ)
- BFS (ํ / ๊ฑฐ๋ฆฌ ๊ณ์ฐ / ๋ค์ค ์์)
- Union-Find (์๋ก์ ์งํฉ)
- Dijkstra (์ฐ์ ์์ ํ ๊ธฐ๋ฐ ์ต๋จ๊ฒฝ๋ก)
- DP ํ ํ๋ฆฟ ๋ชจ์ (1์ฐจ์, ๋ฐฐ๋ญ, ๋ถ๋ถํฉ ๋ฑ)
- Topological Sort (์์ ์ ๋ ฌ)
- Kruskal / Prim (์ต์ ์ ์ฅ ํธ๋ฆฌ)
- Binary Search (์ด๋ถ ํ์ + ์์ฉ: parametric search)
- Floyd-Warshall (๋ชจ๋ ์ ์ต๋จ๊ฑฐ๋ฆฌ)
- Backtracking (์์ด / ์กฐํฉ / ๋ถ๋ถ์งํฉ)
- ์์ฝ ์นํธ์ํธ (ํต์ฌ ํฌ์ธํธ / ๋ณต์ต์ฉ)
1. DFS (Depth-First Search)
๋ชฉ์ : ๊ทธ๋ํ/๊ฒฉ์์์ ๊น๊ฒ ํ์(์ฐ๊ฒฐ ์์, ๊ฒฝ๋ก ์กด์ฌ, ๋ฐฑํธ๋ํน ๋ฑ)
ํต์ฌ ์์ด๋์ด: ํ์ฌ ๋
ธ๋์์ ๊ฐ ์ ์๋ ๊ณณ์ ์ฌ๊ท(๋๋ ์คํ)๋ก ๋๊น์ง ๋ค์ด๊ฐ๊ณ , ๋ ์ด์ ๊ฐ ๋ฐ ์์ผ๋ฉด ๋๋์์ด.
์ฌ๊ท ํ ํ๋ฆฟ (๊ทธ๋ํ: ์ธ์ ๋ฆฌ์คํธ)
static boolean[] visited;
static ArrayList<Integer>[] graph;
static void dfs(int node) {
visited[node] = true;
// ์์
: node ๋ฐฉ๋ฌธ ์ ์ฒ๋ฆฌ (ex. count++, print ๋ฑ)
for (int nxt : graph[node]) {
if (!visited[nxt]) dfs(nxt);
}
}
- ์ฌ์ฉ์ฒ: ์ฐ๊ฒฐ ์์ ๊ฐ์, ๊ฒฝ๋ก ์กด์ฌ ์ฌ๋ถ, ๋ฐฑํธ๋ํน ๊ธฐ๋ฐ ๋ฌธ์
- ์๊ฐ: O(V + E), ๊ณต๊ฐ: recursion depth (O(V)) + visited
2D ๊ฒฉ์ DFS (๋ฏธ๋ก, ์์ญ ํ์)
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
static boolean[][] visited;
static int N, M;
static int[][] map; // ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๊ฐ(1์ด๋ฉด ๋ฐฉ๋ฌธ ๊ฐ๋ฅ ๋ฑ)
static void dfs(int x, int y) {
visited[x][y] = true;
// ์์
: map[x][y] ์ฒ๋ฆฌ
for (int d = 0; d < 4; d++) {
int nx = x + dx[d], ny = y + dy[d];
if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if (!visited[nx][ny] && map[nx][ny] == 1) dfs(nx, ny);
}
}
๋ฐ๋ณต(์คํ) ๋ฒ์
Stack<int[]> st = new Stack<>();
st.push(new int[]{sx, sy});
visited[sx][sy] = true;
while (!st.isEmpty()) {
int[] cur = st.pop();
// ์ฒ๋ฆฌ
for (...) {
if (!visited[nx][ny] && condition) {
visited[nx][ny] = true;
st.push(new int[]{nx, ny});
}
}
}
์ฃผ์์ / ํ
- ์ฌ๊ท ๊น์ด ์ด๊ณผ ์ฃผ์(์๋ฐ ๊ธฐ๋ณธ ์ฝ 10^4 ์์ค). ๊น์ ๊ฒฝ์ฐ ์คํ ์ฌ์ฉํ๊ฑฐ๋ -Xss ์ต์ , ํน์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ณํ.
- visited ํ์๋ ๋ค์ด๊ฐ์๋ง์(์ง์ ์งํ) ํด์ผ ๋ฌดํ ๋ฃจํ ๋ฐฉ์ง.
- ๊ทธ๋ํ๊ฐ ์ฐ๊ฒฐ๋์ง ์์์ผ๋ฉด ๋ชจ๋ ๋ ธ๋์ ๋ํด for ๋ฃจํ ๋๋ ค์ผ ํจ.
2. BFS (Breadth-First Search)
๋ชฉ์ : ๊ฐ๊น์ด ๋
ธ๋๋ถํฐ ๋ ๋ฒจ๋ณ ํ์ — ๊ฐ์ค์น๊ฐ ๊ฐ์ ๊ทธ๋ํ์์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ณด์ฅ
ํต์ฌ: ํ(FIFO)๋ฅผ ์ฌ์ฉํด ๋ ๋ฒจ๋ณ ํ์ฅ
๊ธฐ๋ณธ ํ ํ๋ฆฟ (๊ทธ๋ํ)
Queue<Integer> q = new LinkedList<>();
boolean[] visited = new boolean[N+1];
q.add(start);
visited[start] = true;
while (!q.isEmpty()) {
int cur = q.poll();
// ์ฒ๋ฆฌ
for (int nxt : graph[cur]) {
if (!visited[nxt]) {
visited[nxt] = true;
q.add(nxt);
}
}
}
๊ฑฐ๋ฆฌ ๊ณ์ฐ ํ ํ๋ฆฟ (๊ฒฉ์ ๋๋ ๊ทธ๋ํ)
int[] dist = new int[N+1];
Arrays.fill(dist, -1);
Queue<Integer> q = new LinkedList<>();
q.add(start);
dist[start] = 0;
while (!q.isEmpty()) {
int cur = q.poll();
for (int nxt : graph[cur]) {
if (dist[nxt] == -1) {
dist[nxt] = dist[cur] + 1;
q.add(nxt);
}
}
}
// dist[target]์ด ์ต๋จ ๊ฑฐ๋ฆฌ(์์ผ๋ฉด -1)
๋ค์ค ์์์ (ํ ๋งํ , ๋ถ ํ์ฐ ๋ฑ)
- ์ด๊ธฐ ํ์ ์ฌ๋ฌ ์์์ ์ ๋ฃ๊ณ dist[start]=0 ํ์ฌ ๋์์ ํ์ฐ์ํด.
์ฃผ์์ / ํ
- ๋ฐฉ๋ฌธ ์ฒดํฌ๋ ํ์ ๋ฃ์ ๋ ํด์ผ ํจ(์ค๋ณต enqueue ๋ฐฉ์ง).
- ๋ฉ๋ชจ๋ฆฌ: ํ์ ๋ง์ ๋ ธ๋๊ฐ ๋ค์ด์ฌ ์ ์์(๊ฒฉ์ ํฌ๊ธฐ ๋ฑ ๊ณ ๋ ค).
- BFS๋ ๊ฐ์ค์น๊ฐ ๋์ผํ ๋๋ง ์ต๋จ๊ฑฐ๋ฆฌ. ๊ฐ์ค์น๊ฐ ๋ค๋ฅด๋ฉด Dijkstra ์ฌ์ฉ.
3. Union-Find (Disjoint Set)
๋ชฉ์ : ์งํฉ ํฉ์น๊ธฐ & ๊ฐ์ ์งํฉ์ธ์ง ๋น ๋ฅด๊ฒ ํ์ (์คํ๋ผ์ธ ์ฐ๊ฒฐ์ฑ, Kruskal ๋ฑ)
ํต์ฌ: ๋ฃจํธ(parent) ๋ฐฐ์ด, ๊ฒฝ๋ก ์์ถ, union by rank(optional)
ํ ํ๋ฆฟ
static int[] parent;
static void makeSet(int n) {
parent = new int[n+1];
for (int i = 1; i <= n; i++) parent[i] = i;
}
static int find(int x) {
if (parent[x] == x) return x;
return parent[x] = find(parent[x]); // path compression
}
static void union(int a, int b) {
a = find(a);
b = find(b);
if (a == b) return;
parent[b] = a; // ํน์ rank ๊ธฐ๋ฐ์ผ๋ก ํฉ์น๊ธฐ
}
๋ณตํฉ(๋ญํฌ ์ฌ์ฉ)
- rank[] ๋๋ size[] ์ฌ์ฉํด ์์ ํธ๋ฆฌ๋ฅผ ํฐ ํธ๋ฆฌ์ ๋ถ์ด๋ฉด ๊ท ํ ์ ์ง.
์ฃผ์์
- find์ ๋ฐํ๊ฐ์ผ๋ก ๋น๊ต(find(a)==find(b))ํด์ผ ํจ.
- ์ด๊ธฐํ(makeSet) ์์ง ์๊ธฐ.
4. Dijkstra (์ฐ์ ์์ ํ ๊ธฐ๋ฐ ์ต๋จ๊ฒฝ๋ก)
๋ชฉ์ : ๊ฐ์ค์น(๋น์์) ๊ทธ๋ํ์ ๋จ์ผ ์ถ๋ฐ ์ต๋จ๊ฒฝ๋ก
ํต์ฌ: ์ฐ์ ์์ ํ๋ก ํ์ฌ ์ต๋จ ํ๋ณด ์ ์ ์ ํ, ์์ ์ต์ ํ ํ์
ํ ํ๋ฆฟ
static final int INF = Integer.MAX_VALUE;
static ArrayList<int[]>[] graph; // graph[u] contains {v, cost}
static int[] dist;
static void dijkstra(int start) {
PriorityQueue<int[]> pq = new PriorityQueue<>((a,b) -> a[1]-b[1]);
dist = new int[n+1];
Arrays.fill(dist, INF);
dist[start] = 0;
pq.add(new int[]{start, 0});
while (!pq.isEmpty()) {
int[] cur = pq.poll();
int u = cur[0], d = cur[1];
if (d > dist[u]) continue; // ์ด๋ฏธ ๋ ์งง์ ๊ฒฝ๋ก๊ฐ ์์
for (int[] edge : graph[u]) {
int v = edge[0], w = edge[1];
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.add(new int[]{v, dist[v]});
}
}
}
}
- ์๊ฐ: O(E log V)
์ฃผ์์
- ์์ ๊ฐ์ค์น ์กด์ฌ ์ Dijkstra ๋ถ๊ฐ(๋ฒจ๋ง-ํฌ๋ ์ฌ์ฉ).
- if (d > dist[u]) continue; ์ฒดํฌ ์ค์(์ค๋ณต PQ ์์ดํ ๋ฌด์).
5. DP ํ ํ๋ฆฟ ๋ชจ์ (๊ฐ๋จ ํต์ฌ ํจํด)
1) 1์ฐจ์ ์ ํ์ (์ฐ์ํฉ, ํผ๋ณด๋์น๋ฅ)
dp[0] = base;
for (int i = 1; i <= N; i++) {
dp[i] = f(dp[i-1], dp[i-2], ...); // ๋ฌธ์ ์ ๋ง๊ฒ
}
2) 0/1 Knapsack (์ญ๋ฐฉํฅ 1์ฐจ์ ์์ถ)
int[] dp = new int[W+1];
for (int i = 0; i < N; i++) {
for (int w = W; w >= weight[i]; w--) {
dp[w] = Math.max(dp[w], dp[w-weight[i]] + value[i]);
}
}
3) Unbounded Knapsack (๋ฌด์ ํ)
for (int i = 0; i < N; i++) {
for (int w = weight[i]; w <= W; w++) {
dp[w] = Math.max(dp[w], dp[w-weight[i]] + value[i]);
}
}
4) Subset Sum / Coin Change (๋ฐฉ๋ฒ ์)
dp[0] = 1;
for (int coin : coins) {
for (int j = coin; j <= target; j++) {
dp[j] += dp[j-coin];
}
}
5) ๋ฉ๋ชจ์ด์ ์ด์ (ํ๋ค์ด)
int[] memo = new int[MAX];
Arrays.fill(memo, -1);
int dfs(int state) {
if (memo[state] != -1) return memo[state];
memo[state] = compute(...);
return memo[state];
}
์ฃผ์์
- 1์ฐจ์ ์์ถํ ๋ ์ ์ด ๋ฐฉํฅ(์ญ์/์ ๋ฐฉํฅ)์ ๊ผผ๊ผผํ ๋ฐ์ง ๊ฒ.
- ์ด๊ธฐ๊ฐ, ๋ถ๊ฐ๋ฅ ๊ฐ ์ฒ๋ฆฌ(-INF, INF, false ๋ฑ) ์์ง ๋ง๊ธฐ.
6. Topological Sort (์์ ์ ๋ ฌ)
๋ชฉ์ : DAG์์ ์์(์ ํ ์กฐ๊ฑด)๋ฅผ ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ
ํ
ํ๋ฆฟ
int[] indeg = new int[N+1];
Queue<Integer> q = new LinkedList<>();
for (int i = 1; i <= N; i++) if (indeg[i] == 0) q.add(i);
while (!q.isEmpty()) {
int cur = q.poll();
order.add(cur);
for (int nxt : graph[cur]) {
indeg[nxt]--;
if (indeg[nxt] == 0) q.add(nxt);
}
}
- ์ฌ์ฉ ์: ์์ ์ค์ผ์ค, ์์ ์ ๋ ฌ์ ํตํ DP(์ต์ฅ ๊ฒฝ๋ก in DAG)
7. Kruskal / Prim (MST)
Kruskal (๊ฐ๋จ)
Collections.sort(edges, (a,b) -> a[2] - b[2]);
makeSet(n);
int total = 0;
for (int[] e : edges) {
if (find(e[0]) != find(e[1])) {
union(e[0], e[1]);
total += e[2];
}
}
Prim (์ฐ์ ์์ ํ ๊ธฐ๋ฐ)
PriorityQueue<int[]> pq = new PriorityQueue<>((a,b)->a[1]-b[1]);
boolean[] used = new boolean[n+1];
pq.add(new int[]{start, 0});
int total = 0;
while (!pq.isEmpty()) {
int[] cur = pq.poll();
if (used[cur[0]]) continue;
used[cur[0]] = true; total += cur[1];
for (int[] nxt : graph[cur[0]]) {
if (!used[nxt[0]]) pq.add(new int[]{nxt[0], nxt[1]});
}
}
8. Binary Search (์ด๋ถ ํ์)
ํ ํ๋ฆฟ(์ ์ ๋ฐฐ์ด์์ ์ฐพ๊ธฐ)
int l = 0, r = n-1;
while (l <= r) {
int mid = (l + r) >>> 1;
if (arr[mid] == target) return mid;
if (arr[mid] < target) l = mid + 1;
else r = mid - 1;
}
return -1;
์์ฉ: Parametric Search(๊ฐ๋ฅ/๋ถ๊ฐ๋ฅ ํ์ )
- while (l <= r)๋ก mid ์ก๊ณ , check(mid) ํจ์๋ก ์กฐ๊ฑด ์ถฉ์กฑ ์ฌ๋ถ ํ๋จ. (ex: ๋๋ฌด ์๋ฅด๊ธฐ, ๊ณต์ ๊ธฐ ์ค์น)
9. Floyd-Warshall (๋ชจ๋ ์ ์ต๋จ๊ฑฐ๋ฆฌ)
for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) dist[i][j] = (i==j?0:INF);
for edges: dist[u][v]=w;
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
- ์๊ฐ: O(n^3) → n ≤ ~400 ์ ๋๊น์ง ์ค์ฉ์
10. Backtracking (์์ด/์กฐํฉ/๋ถ๋ถ์งํฉ)
์์ด
void perm(int idx) {
if (idx == m) { print(); return; }
for (int i = 0; i < n; i++) {
if (used[i]) continue;
used[i] = true;
sel[idx] = arr[i];
perm(idx+1);
used[i] = false;
}
}
์กฐํฉ
void comb(int start, int depth) {
if (depth == k) { print(); return; }
for (int i = start; i < n; i++) {
sel[depth] = arr[i];
comb(i+1, depth+1);
}
}
๊ฐ์ง์น๊ธฐ(Pruning)
- ์ ๋ ฌ + ํ์ฌ ํฉ + ๋จ์ ์ต๋ ํฉ ๋น๊ต → ๋ถํ์ ๊ฐ์ง์น๊ธฐ ๊ฐ๋ฅ
11. ์์ฝ ์นํธ์ํธ (์ธ์ฐ๊ธฐ์ฉ)
- DFS: ์ฌ๊ท, visited ๋จผ์ , ์ฌ๊ท ๊น์ด ์ฃผ์
- BFS: ํ, enqueue ์ visited=true, ๊ฑฐ๋ฆฌ dist[cur]+1
- Union-Find: find()์ ๊ฒฝ๋ก ์์ถ, union()์ผ๋ก ํฉ์น๊ธฐ
- Dijkstra: PQ, if (d > dist[u]) continue;
- 0/1 Knapsack: ์ญ๋ฐฉํฅ for (w = W..wt)
- Unbounded Knapsack / Coin change: ์ ๋ฐฉํฅ for (w = wt..W)
- Toposort: indegree 0 → ํ
- Kruskal: ๊ฐ์ ์ ๋ ฌ + union-find
- Binary Search: ๋ฒ์๋ฅผ ์ค์ด๋ check(mid) ํจํด
- Floyd: 3์ค for (k,i,j)
- Backtracking: ์ฌ๊ท + visited + ๋ณต๊ตฌ(restore)
๋ง์ง๋ง์ผ๋ก — ์๊ธฐ & ์ฐ์ต ํ
- ํ ํ๋ฆฟ์ ์งง๊ณ ์์ฃผ ๋ณต์ตํ์ธ์. ๋ฌธ์ ํ ๋ ๋ฐ๋ก ๋ถ์ฌ๋ฃ์ ์ ์์ด์ผ ํฉ๋๋ค.
- ์์ ์์๋ก ์๋ ์๋ฎฌ๋ ์ด์ ํด๋ณด์ธ์ — ์ฝ๋๊ฐ ์ ๋์ํ๋์ง ๋ณด์ด๋ฉด ๊ธฐ์ต์ด ์ค๋๊ฐ๋๋ค.
- ํ ๋ฒ์ ํ ํจํด์ฉ ์ง์ค ์ฐ์ต: ์) ํ๋ฃจ๋ BFS ๋ฌธ์ 5๊ฐ, ๋ค์ ๋ Union-Find 5๊ฐ.
- ์ฝํ ์ ์๋ Scanner ๋์ BufferedReader, StringTokenizer ์ฌ์ฉ ํ ํ๋ฆฟ์ ์ค๋นํ์ธ์.
- ์ค์ ์์๋ ์ค๋ฅ๋ฅผ ์ค์ด๋ ค๋ฉด ์ฃผ์ + ๋ณ์๋ช ์ ๋ช ํํ ํด๋๋ฉด ์ข์ต๋๋ค.
'Algorithm - Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| DFS, BFS Template (0) | 2025.10.21 |
|---|---|
| ๋ฐฑ์ค์์ ํ๋ก๊ทธ๋๋จธ์ค ์์์ฒ๋ผ (0) | 2022.06.08 |