- Today
- Total
- ์์์ ๋ ฌ
- ๊ตฌํ
- MST
- pytorch
- dp
- CS
- Graph
- ๋ฐฑ์ค
- ๋ฒจ๋งํฌ๋
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ฐฑ์๋
- ์ธํด
- leetcode
- spring
- ๋ฌธ๋ฒ
- ๋ค์ต์คํธ๋ผ
- ์๋ฐ
- BFS
- ๊ทธ๋ฆฌ๋
- ์๋ฃ๊ตฌ์กฐ
- OOP
- database
- PS
- java
- ์กธ์ ์ํ
- tree
- Algorithm
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์๋ฐ์์ ์
- array
Partially Committed
[๋ฐฑ์ค 9251/1520/9370] ์๋ฐ ๋ณธ๋ฌธ
(title: [๋ฐฑ์ค 9251/1520/9370] ์๋ฐ)
A. LCS BOJ 9251
https://www.acmicpc.net/problem/9251
๋์ด๋ | Gold 5 |
ํ์ด ์๊ฐ | 10๋ถ |
๋ถ๋ฅ | DP |
์๊ฐ๋ณต์ก๋ | O(NM) |
๊ณต๊ฐ๋ณต์ก๋ |
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk;
String str1 = br.readLine();
String str2 = br.readLine();
int n = str1.length();
int m = str2.length();
int[][] dp = new int[n + 1][m + 1];
int max_length = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if(str1.charAt(i-1)==str2.charAt(j-1)){
// ๊ฐ๋ค๋ฉด
dp[i][j] = dp[i-1][j-1] + 1;
} else {
// ๊ฐ์ง ์๋ค๋ฉด
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
max_length = Math.max(dp[i][j], max_length);
}
}
bw.write(max_length+"\n");
bw.flush();
bw.close();
}
}
(์ถ๊ฐ)
์ ๋ฌธ์ ๋ LCS ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด์ง๋ง ๋ง์ฝ LCS ์์ฒด๋ฅผ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์๋์ ์ญ์ถ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
Stack<Character> st = new Stack<>();
int now = 0;
int i = n;
int j = m;
while (i > 0 && j > 0) {
if (i == 0 || j == 0)
continue;
now = dp[i][j];
if (now == dp[i - 1][j]) {
i--;
} else if (now == dp[i][j - 1]) {
j--;
} else {
st.add(str1.charAt(i - 1));
i--;
j--;
}
}
bw.write(max_length + "\n");
while (!st.empty()){
bw.append(st.pop());
} bw.newLine();
OUTPUT:
4
ACAK
B. ๋ด๋ฆฌ๋ง๊ธธ BOJ 1520
https://www.acmicpc.net/problem/1520
๋์ด๋ | Gold 3 |
ํ์ด ์๊ฐ | 50๋ถ |
๋ถ๋ฅ | DFS + DP, BFS with Priority Queue |
์๊ฐ๋ณต์ก๋ | dfs : O(4V) ~= O(V) bfs : O(VlogV) |
๊ณต๊ฐ๋ณต์ก๋ | O(V) |
[1. DFS + DP ๋ฅผ ์ด์ฉํ ํ์ด]
static int dfs(int x, int y) {
if (y == row - 1 && x == col - 1) {
return 1;
}
if (dp[y][x] != -1) {
return dp[y][x]; // ์ด๋ฏธ ์ ์ฅ๋ ๊ฐ์ด ์์ ์ ๊ทธ๊ฒ์ ๋ฐํ
}
dp[y][x] = 0;
for (int dir = 0; dir < 4; dir++) {
int nx = x + dx[dir];
int ny = y + dy[dir]; // ์๋ก ์ด๋ํ ์ขํ
if (nx < 0 || nx >= col || ny < 0 || ny >= row) {
continue; // out of bounds
}
if (graph[y][x] > graph[ny][nx]) {
// ๋ด๋ฆฌ๋ง ๊ธธ์ด๋ฉด
dp[y][x] += dfs(nx, ny);
}
}
return dp[y][x];
}
[2. BFS + Priority Queue ๋ฅผ ์ฌ์ฉํ ํ์ด]
static int bfs(int x, int y, int heigh) {
dp[y][x] = 1;
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(x, y, heigh));
while (!pq.isEmpty()) {
Node now = pq.poll();
for (int dir = 0; dir < 4; dir++) {
int nx = now.x + dx[dir];
int ny = now.y + dy[dir];
if (nx < 0 || nx >= col || ny < 0 || ny >= row) {
continue; // out of bounds
}
if (graph[now.y][now.x] > graph[ny][nx]) {
// ๋ด๋ฆฌ๋ง ๊ธธ์ด๋ฉด
if (dp[ny][nx]==0) {
pq.add(new Node(nx, ny, graph[ny][nx]));
}
dp[ny][nx] += dp[now.y][now.x];
}
}
}
return dp[row - 1][col - 1];
}
C. ๋ฏธํ์ธ ๋์ฐฉ์ง BOJ 9370
https://www.acmicpc.net/problem/9370
๋์ด๋ | Gold 2 |
ํ์ด ์๊ฐ | 40 ๋ถ |
๋ถ๋ฅ | ๋ค์ต์คํธ๋ผ |
์๊ฐ๋ณต์ก๋ | ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ O((V+E)logV) ์ด๋ค. ๋ ธ๋์ ์ต๋ ๊ฐ์๋ 2000 ๊ฐ์ด๊ณ ์ฃ์ง์ ์ต๋ ๊ฐ์๋ 50000 ๊ฐ ๊ทธ๋ฆฌ๊ณ ํ ์คํธ ์ผ์ด์ค์ ์ต๋ ๊ฐ์๋ 100 ๊ฐ์ด๋ค ๊ทธ๋ฌ๋ฉด ์ต์ ์ ๊ฒฝ์ฐ์ ์๊ฐ ๋ณต์ก๋๋ ๋๋ต (2000+50000)log2000 * 100 ~= 17,165,355 = ์ฒ์น ๋ฐฑ๋ง๋ฒ์ ์ฐ์ฐ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ผ๋ฐ์ ์ธ ํ๊ฒฝ์์ 2์ฒ๋ง๋ฒ์ ์ฐ์ฐ์ 1์ด ์ด๋ด์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ฏ๋ก, ์ ์ฝ๋๋ ์๊ฐ์ ํ 3 ์ด ์์ ์์ ํ๊ฒ ์ํ๋ ๊ฒ์ด๋ผ๊ณ ํฉ๋ฆฌ์ ์ผ๋ก ์์์ด ๊ฐ๋ฅํ๋ค. |
๊ณต๊ฐ๋ณต์ก๋ | O(n+m) |
๋ฌธ์ ์ค๋ช ์ด ์กฐ๊ธ ์ดํดํ๊ธฐ ์ด๋ ต๊ฒ ๋์ด์๋๋ฐ, ๊ฐ๋จํ๊ฒ ์์ฝํ๋ฉด ์ด๋ ๋ค.
์ฃผ์ด์ง๋ ์ ๋ณด๋ s(์์์ ), t0,t1,t2...(ํ๋ณด ๋ชฉ์ ์ง), g-h (๋ชฉ์ ์ง๋ก ํฅํ ๋ ๋ฐ๋์ ๊ฑฐ์ณ์ผ ํ๋ ๊ฒฝ๋ก) ์ธ๋ฐ,
์ฐ๋ฆฌ๊ฐ ๊ตฌํด์ผ ํ๋ ๊ฒ์ s ๋ถํฐ g-h , h-g ๋ฅผ ๊ฑฐ์ณ์ ํ๋ณด ๋ชฉ์ ์ง์ธ t0, ... tn ์ ๋๋ฌํ๋ ๊ฒ์ด ์ต๋จ ๊ฒฝ๋ก์ธ ์ง ํ์ ํ๋ ๊ฒ์ด๋ค.
์ฆ, s ์์ ์ถ๋ฐํ์ฌ ํ๋ณด ๋ชฉ์ ์ง์ ๋๋ฌํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ(1)์ s ์์ ์ถ๋ฐํ๊ณ g-h ํน์ h-g ๋ฅผ ๊ฑฐ์ณ์ ํ๋ณด ๋ชฉ์ ์ง์ ๋๋ฌํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ(2)๋ฅผ ๊ตฌํ ๋ค์ ์ด๋ฅผ ๋น๊ตํ์ฌ ํ๋ณด ๋ชฉ์ ์ง ์ค์์ ๊ฐ๋ฅํ์ง ์์ ๊ฒ์ ์ ์ธ์์ผ์ฃผ๋ฉด ๋๋ค.
์ด๋ฌํ ํ๋จ์ด ๊ฐ๋ฅํ ์ด์ ๋ ๋ฌธ์ ์ํฉ์์ ์์ปค์ค ์์ ๊ฐ ํ ์์ ๋ฐ๋์ ์ต๋จ ๊ฒฝ๋ก๋ก๋ง ์ด๋ํ๋ค๋ ๊ฐ์ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ค์ด g ์ h ์ฌ์ด์ ๋๋ก๋ฅผ ํต๊ณผํ๋ค๋ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ฏ๋ก,
g ์ h ์ฌ์ด์ ๋๋ก๋ฅผ ํต๊ณผํ์ง ์๊ณ ํ๋ณด ๋ชฉ์ ์ง๋ก ๋๋ฌํ๋ ๋ฐฉ๋ฒ์ด ์ต๋จ ๊ฑฐ๋ฆฌ๋ผ๋ฉด
ํ๋ณด ๋ชฉ์ ์ง์์ ์ ์ธํด๋ ๋๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ๊น?
์ฐ๋ฆฌ๊ฐ ์ป์ด์ผ ํ๋ ์ ๋ณด๋ ์๋ ๋ ๊ฐ์ง ์ด๋ค.
1. s ๋ถํฐ ํ๋ณด ๋ชฉ์ ์ง๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ
2. s ๋ถํฐ g์ h ์ฌ์ด์ ๋๋ก๋ฅผ ๊ฑฐ์ณ์ ํ๋ณด ๋ชฉ์ ์ง๊น์ง ๋๋ฌํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ
(2) ๋ถํฐ ์๊ฐํด๋ณด์.s ์์ ์ถ๋ฐํ์ฌ g ์ h ์ฌ์ด์ ๋๋ก๋ฅผ ๊ฑฐ์ณ์ ํ๋ณด ๋ชฉ์ ์ง(t) ๊น์ง ๋๋ฌํ๋ ๊ฒฝ์ฐ๋ ์๋ ๋ ๊ฐ์ง ์ผ์ด์ค๊ฐ ๊ฐ๋ฅํ๋ค.s->g->h->ts->h->g->t๊ทธ๋ฌ๋ฏ๋ก (2) = Math.min(s->g->h->t, s->h->g->t) ์ผ๋ก ๊ตฌํ๋ฉด ๋ ํ ๋ฐ,
์ด๋ฅผ ์ํด์๋ s->g ๊น์ง์ ์ต๋จ๊ฒฝ๋ก, g->h ๊น์ง์ ์ต๋จ๊ฒฝ๋ก, h->t ๊น์ง์ ์ต๋จ๊ฒฝ๋ก, s->h ๊น์ง์ ์ต๋จ๊ฒฝ๋ก, g->t ๊น์ง์ ์ต๋จ๊ฒฝ๋ก๊ฐ ํ์ํ๋ค.
(1) ์ ๊ฒฝ์ฐ์๋ s->t ๊น์ง์ ์ต๋จ๊ฒฝ๋ก๊ฐ ํ์ํ๋ค.
์ฆ, 3 ๊ฐ์ง ์์ ๋ ธ๋(s, g, h)๋ก ๋ถํฐ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ ์ ์์ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ป๊ณ ์ ํ๋ ์ ๋ณด๋ฅผ ๋ชจ๋ ์ป์์ ์๋ค.
3๊ฐ์ง ๋จ์ผ ๋ ธ๋์ ๋ํ ์ ์ฒด ๋ ธ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ฉด ๋๋๋ฐ, ์ด๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์์์ ์ ๋ฐ๊พธ์ด ๊ฐ๋ฉด์ 3๋ฒ ์ํํ๋ฉด ๋ ๊ฒ์์ ์๊ฐํ ์ ์๋ค.
๋ง์นจ, ์ฃ์ง์ ๊ฐ์ค์น๋ค์ ๋ชจ๋ ์์์ด๋ฏ๋ก ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ ์ ์์ผ๋ฉฐ,
์๊ฐ ๋ณต์ก๋ ๋ํ ๋๋ํ๋ค.
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ O((V+E)logV) ์ด๋ค.
๋
ธ๋์ ์ต๋ ๊ฐ์๋ 2000 ๊ฐ์ด๊ณ
์ฃ์ง์ ์ต๋ ๊ฐ์๋ 50000 ๊ฐ
๊ทธ๋ฆฌ๊ณ ํ
์คํธ ์ผ์ด์ค์ ์ต๋ ๊ฐ์๋ 100 ๊ฐ์ด๋ค
๊ทธ๋ฌ๋ฉด ์ต์
์ ๊ฒฝ์ฐ์ ์๊ฐ ๋ณต์ก๋๋ ๋๋ต
(2000+50000)log2000 * 100 ~= 17,165,355 = ์ฒ์น ๋ฐฑ๋ง๋ฒ์ ์ฐ์ฐ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ผ๋ฐ์ ์ธ ํ๊ฒฝ์์ 2์ฒ๋ง๋ฒ์ ์ฐ์ฐ์ 1์ด ์ด๋ด์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ฏ๋ก,
์ ์ฝ๋๋ ์๊ฐ์ ํ 3์ด ์์ ์์ ํ๊ฒ ์ํ๋ ๊ฒ์ด๋ผ๊ณ ํฉ๋ฆฌ์ ์ผ๋ก ์์์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋ค์ต์คํธ๋ผ์ ์์์ ์ s, g, h ๋ก ๋ฐ๊พธ์ด ๊ฐ๋ฉด์ 3 ๋ฒ ์ํํ๋ฉฐ
s->g ๊น์ง์ ์ต๋จ๊ฒฝ๋ก, g->h ๊น์ง์ ์ต๋จ๊ฒฝ๋ก, h->t ๊น์ง์ ์ต๋จ๊ฒฝ๋ก, s->h ๊น์ง์ ์ต๋จ๊ฒฝ๋ก, g->t ๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ป์ด๋ด๊ณ ,
์ด๋ก๋ถํฐ
1. s ๋ถํฐ ํ๋ณด ๋ชฉ์ ์ง๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ
2. s ๋ถํฐ g์ h ์ฌ์ด์ ๋๋ก๋ฅผ ๊ฑฐ์ณ์ ํ๋ณด ๋ชฉ์ ์ง๊น์ง ๋๋ฌํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ
๋ฅผ ๋์ถํ ๋ค์
g ์ h ์ฌ์ด์ ๋๋ก๋ฅผ ํต๊ณผํ์ง ์๊ณ ํ๋ณด ๋ชฉ์ ์ง๋ก ๋๋ฌํ๋ ๋ฐฉ๋ฒ(1)์ด
g ์ h ์ฌ์ด์ ๋๋ก๋ฅผ ํต๊ณผํ๊ณ ํ๋ณด ๋ชฉ์ ์ง๋ก ๋๋ฌํ๋ ๋ฐฉ๋ฒ(2) ๋ณด๋ค ์ต๋จ ๊ฑฐ๋ฆฌ๋ผ๋ฉด ํ๋ณด ๋ชฉ์ ์ง์์ ์ ์ธ์์ผ์ค๋ค.
(์๋๋ฉด ๋ฌด์กฐ๊ฑด g-h ๋ฅผ ํต๊ณผํด์ ์ต๋จ ๊ฒฝ๋ก๋ก ์งํํ๋ค๋ ์ ์ ๊ฐ ์ฃผ์ด์ก๋๋ฐ, ๊ณ์ฐ ํด๋ณด๋ g-h ๋ฅผ ํต๊ณผํ๋ ๋ฐฉ๋ฒ์ด ์ต๋จ ๊ฒฝ๋ก๊ฐ ์๋๋ผ๋ฉด ํ๋ณด ๋ชฉ์ ์ง๊ฐ ์๋๊ธฐ ๋๋ฌธ์ด๋ค.)
์ด๋ ๊ฒ ํ๋ฉด AC ๋ฅผ ๋ฐ์ ์ ์๋ค.
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int m;
static int t;
static int s;
static int g;
static int h;
static ArrayList<Node>[] graph;
static int[] dist;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk;
int tc = Integer.parseInt(br.readLine());
while (tc > 0) {
tc--;
ArrayList<Integer> anslist = new ArrayList<>();
stk = new StringTokenizer(br.readLine());
n = Integer.parseInt(stk.nextToken()); // ๋
ธ๋ ๊ฐ์
m = Integer.parseInt(stk.nextToken()); // ์ฃ์ง ๊ฐ์
t = Integer.parseInt(stk.nextToken()); // ํ๋ณด ๊ฐ์
stk = new StringTokenizer(br.readLine());
s = Integer.parseInt(stk.nextToken()); // ์์์
g = Integer.parseInt(stk.nextToken());
h = Integer.parseInt(stk.nextToken());
init();
for (int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
int a = Integer.parseInt(stk.nextToken());
int b = Integer.parseInt(stk.nextToken());
int d = Integer.parseInt(stk.nextToken());
graph[a].add(new Node(b, d));
graph[b].add(new Node(a, d)); // ์๋ฐฉํฅ
}
int minimum_path = Integer.MAX_VALUE;
for (int i = 0; i < t; i++) {
int dest = Integer.parseInt(br.readLine());
dijkstra(s);
int s2dest = dist[dest];
int s2g = dist[g];
int s2h = dist[h];
dijkstra(g);
int g2dest = dist[dest];
int g2h = dist[h];
dijkstra(h);
int h2dest = dist[dest];
int inf = Integer.MAX_VALUE;
if (s2dest == inf || s2g == inf || s2h == inf || g2h == inf)
continue;
int s2g2h2dest = s2g + g2h + h2dest;
int s2h2g2dest = s2h + g2h + g2dest;
minimum_path = Math.min(s2g2h2dest, s2h2g2dest);
if(s2dest < minimum_path){
continue;
} else {
anslist.add(dest);
}
}
Collections.sort(anslist);
for (Integer iter : anslist) {
bw.write(iter + " ");
}
bw.newLine();
}
bw.flush();
bw.close();
}
static class Node implements Comparable<Node> {
int to;
int w;
public Node(int to, int w) {
this.to = to;
this.w = w;
}
@Override
public int compareTo(Node o) {
if (this.w > o.w)
return 1;
else return -1;
}
}
static void dijkstra(int start) {
PriorityQueue<Node> pq = new PriorityQueue<>();
Arrays.fill(dist, Integer.MAX_VALUE);
dist[start] = 0;
pq.add(new Node(start, 0));
while (!pq.isEmpty()) {
Node now = pq.poll();
for (Node cur : graph[now.to]) {
// ์ฐ๊ฒฐ ๋
ธ๋ ํ์
if (dist[cur.to] > dist[now.to] + cur.w) {
dist[cur.to] = dist[now.to] + cur.w;
pq.add(new Node(cur.to, dist[cur.to]));
}
}
}
}
static void init() {
graph = new ArrayList[n + 1];
for (int i = 0; i <= n; i++) {
graph[i] = new ArrayList<>();
}
dist = new int[n + 1];
}
}
'๐ฅ Algorithm || ๋ฌธ์ ํ์ด > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 13549/1956/1620/2629] ์๋ฐ (0) | 2023.02.22 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ์นด๋๋ญ์น (JAVA) (1) | 2023.02.20 |
[๋ฐฑ์ค 5568/2559/1504/11066] ์๋ฐ (0) | 2023.02.19 |
[๋ฐฑ์ค 18870/2565/2470/4195] ์๋ฐ (0) | 2023.02.17 |
[๋ฐฑ์ค 1436/10815/11054/16139/16928] ์๋ฐ (0) | 2023.02.16 |