Skip to content

Commit d6b0170

Browse files
committed
feat : 2025-09-11 Baekjoon Silver & Gold question solved.
1 parent ba13f6f commit d6b0170

3 files changed

Lines changed: 195 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
public static void main(String[] args) throws Exception {
6+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
StringBuilder out = new StringBuilder();
8+
int T = Integer.parseInt(br.readLine().trim());
9+
10+
while (T-- > 0) {
11+
StringTokenizer st = new StringTokenizer(br.readLine());
12+
int N = Integer.parseInt(st.nextToken());
13+
int K = Integer.parseInt(st.nextToken());
14+
15+
int[] cost = new int[N + 1];
16+
st = new StringTokenizer(br.readLine());
17+
for (int i = 1; i <= N; i++) cost[i] = Integer.parseInt(st.nextToken());
18+
19+
List<Integer>[] g = new ArrayList[N + 1];
20+
for (int i = 1; i <= N; i++) g[i] = new ArrayList<>();
21+
int[] indeg = new int[N + 1];
22+
23+
for (int i = 0; i < K; i++) {
24+
st = new StringTokenizer(br.readLine());
25+
int X = Integer.parseInt(st.nextToken());
26+
int Y = Integer.parseInt(st.nextToken());
27+
g[X].add(Y); // X 먼저 → Y
28+
indeg[Y]++;
29+
}
30+
31+
int W = Integer.parseInt(br.readLine().trim());
32+
33+
// 위상정렬 + DP
34+
int[] dp = new int[N + 1]; // i번 건물 완성까지의 최소 시간(=최장 선행시간 + cost[i])
35+
ArrayDeque<Integer> q = new ArrayDeque<>();
36+
37+
for (int i = 1; i <= N; i++) {
38+
if (indeg[i] == 0) {
39+
dp[i] = cost[i];
40+
q.add(i);
41+
}
42+
}
43+
44+
while (!q.isEmpty()) {
45+
int cur = q.poll();
46+
for (int nxt : g[cur]) {
47+
// nxt를 짓기 전까지 필요한 선행 최대 시간 갱신
48+
if (dp[nxt] < dp[cur] + cost[nxt]) {
49+
dp[nxt] = dp[cur] + cost[nxt];
50+
}
51+
if (--indeg[nxt] == 0) q.add(nxt);
52+
}
53+
}
54+
55+
out.append(dp[W]).append('\n');
56+
}
57+
58+
System.out.print(out.toString());
59+
}
60+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
public static void main(String[] args) throws Exception {
6+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
StringTokenizer st = new StringTokenizer(br.readLine());
8+
long N = Long.parseLong(st.nextToken());
9+
int L = Integer.parseInt(st.nextToken());
10+
11+
for (int k = L; k <= 100; k++) {
12+
long numerator = N - (long)k * (k - 1) / 2; // N - k(k-1)/2
13+
if (numerator < 0) break; // 더 길어지면 더 작아지므로 불가능
14+
if (numerator % k != 0) continue; // a가 정수가 아니면 패스
15+
16+
long a = numerator / k; // 시작값
17+
if (a < 0) continue; // 음수면 조건 위반
18+
19+
StringBuilder sb = new StringBuilder();
20+
for (int i = 0; i < k; i++) {
21+
if (i > 0) sb.append(' ');
22+
sb.append(a + i);
23+
}
24+
System.out.println(sb.toString());
25+
return;
26+
}
27+
28+
System.out.println(-1);
29+
}
30+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
static int N;
6+
static int[][] map;
7+
static int sr, sc; // shark row, col
8+
static int size = 2; // initial size
9+
static int eaten = 0; // eaten count toward next size
10+
static int time = 0; // total time (answer)
11+
static final int[] dr = {-1, 0, 0, 1}; // 상, 좌, 우, 하 (거리 동일시 행/열 우선 tie-break에 유리: 상→좌 우선 탐색)
12+
static final int[] dc = {0, -1, 1, 0};
13+
14+
public static void main(String[] args) throws Exception {
15+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
16+
N = Integer.parseInt(br.readLine().trim());
17+
map = new int[N][N];
18+
19+
for (int i = 0; i < N; i++) {
20+
StringTokenizer st = new StringTokenizer(br.readLine());
21+
for (int j = 0; j < N; j++) {
22+
map[i][j] = Integer.parseInt(st.nextToken());
23+
if (map[i][j] == 9) { // 아기 상어 시작점
24+
sr = i; sc = j;
25+
map[i][j] = 0; // 빈 칸으로 바꿔둔다
26+
}
27+
}
28+
}
29+
30+
while (true) {
31+
Target t = bfsFindTarget();
32+
if (t == null) break; // 더 이상 먹을 물고기 없음
33+
34+
// 이동 & 섭취
35+
time += t.dist;
36+
sr = t.r; sc = t.c;
37+
map[sr][sc] = 0;
38+
eaten++;
39+
if (eaten == size) {
40+
size++;
41+
eaten = 0;
42+
}
43+
}
44+
45+
System.out.println(time);
46+
}
47+
48+
// 가장 가까운 먹이 하나를 찾는다. 없다면 null
49+
static Target bfsFindTarget() {
50+
int[][] dist = new int[N][N];
51+
for (int i = 0; i < N; i++) Arrays.fill(dist[i], -1);
52+
53+
ArrayDeque<int[]> q = new ArrayDeque<>();
54+
q.add(new int[]{sr, sc});
55+
dist[sr][sc] = 0;
56+
57+
int bestDist = Integer.MAX_VALUE;
58+
int bestR = -1, bestC = -1;
59+
60+
while (!q.isEmpty()) {
61+
int[] cur = q.poll();
62+
int r = cur[0], c = cur[1];
63+
64+
int d = dist[r][c];
65+
// 이미 발견한 최단 먹이 거리보다 멀면 더 볼 필요 없음
66+
if (d > bestDist) continue;
67+
68+
// 먹을 수 있는 물고기(1~6)이고, 상어 크기보다 작아야 함
69+
if (map[r][c] > 0 && map[r][c] < size) {
70+
// 후보 갱신: 거리 최소, 거리 같으면 행 최소, 그래도 같으면 열 최소
71+
if (d < bestDist ||
72+
(d == bestDist && (r < bestR ||
73+
(r == bestR && c < bestC)))) {
74+
bestDist = d;
75+
bestR = r; bestC = c;
76+
}
77+
// 같은 거리의 다른 후보가 있을 수 있으므로 계속 탐색하되,
78+
// 거리가 더 커지는 레벨은 위의 if (d > bestDist) 에 걸려 스킵됨.
79+
}
80+
81+
// 인접 칸으로 BFS 확장
82+
for (int k = 0; k < 4; k++) {
83+
int nr = r + dr[k];
84+
int nc = c + dc[k];
85+
if (nr < 0 || nr >= N || nc < 0 || nc >= N) continue;
86+
if (dist[nr][nc] != -1) continue;
87+
// 이동 가능 조건: 상어 크기보다 작거나 같은 칸만 통과 가능(0=빈칸 포함)
88+
if (map[nr][nc] <= size) {
89+
dist[nr][nc] = d + 1;
90+
q.add(new int[]{nr, nc});
91+
}
92+
}
93+
}
94+
95+
if (bestR == -1) return null; // 못 찾음
96+
return new Target(bestR, bestC, bestDist);
97+
}
98+
99+
static class Target {
100+
int r, c, dist;
101+
Target(int r, int c, int dist) {
102+
this.r = r; this.c = c; this.dist = dist;
103+
}
104+
}
105+
}

0 commit comments

Comments
 (0)