티스토리 뷰
반응형
#. Problem
https://www.acmicpc.net/problem/20647 |
* The copyright in this matter is in acmicpc
#. Resolution Process
- Read and understand problem
- Redefine the problem + abstract
- Create solution plan (select Algorithm, Data structure)
- Prove the plan (check performance time and usage memory)
- Carry out the plan
- Look back on the plan and find a way to improve it
#. Solve
농장 : 1 ~ N^5
길 : 1 ~ N-1
<주어진 정보>
이벤트
1. 해당 농장에서 감염 소 2배 증가
2. 감염된 소 한 마리가 인접 농장으로 이동
<목적>
"모든 농장에서 적어도 한 마리의 소가 질병에 걸리기까지 가능한 최소 일수"
//
오랜만에 푸니까 적응이 안 되는군...
우선 N은 최대 10^5 이므로, 한 번의 반복문에서 끝내야 한다.
처음에 그래프 문제라고 생각은 해서 단순하게 풀어보려고 단방향으로만 생각을 했었다.
하지만.. 단방향으로 풀게 되면 루트(부모 노드)를 찾을 수 없게 되었고..
결국 양방향으로 전환을 해서 트리 모양을 만들어 풀게 되었다.
#. Code
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
import java.io.*;
import java.util.*;
public class Main {
FastScanner in;
PrintWriter out;
static int N, a, b, cntAdjacentLoads[];
void solve() {
N = in.nextInt();
cntAdjacentLoads = new int[N + 1];
for (int i = 0; i < N-1; i++) {
a = in.nextInt();
b = in.nextInt();
cntAdjacentLoads[a]++;
cntAdjacentLoads[b]++;
}
int day = 0;
for (int i = 1; i <= N; i++) {
if (cntAdjacentLoads[i] > 1) { // 연결된 길이 있을 경우 (자식 노드가 있을 경우)
if (i != 1) cntAdjacentLoads[i]--; // 부모 노드는 이미 방문하였으므로 제외 (root 노드는 부모 노드가 없으므로 pass)
int infectedCow = 1; // 감염된 소
while (infectedCow < cntAdjacentLoads[i] + 1) { // 연결된 농장의 개수(+1은 현재 농장)만큼 감염된 소 증가
infectedCow *= 2; // 해당 농장에서 감염 소 2배 증가
++day;
}
}
if (i != 1) day++; // 감염된 소 한 마리가 인접 농장으로 이동하는 이벤트
}
out.println(day);
}
void run() {
in = new FastScanner();
out = new PrintWriter(System.out);
solve();
out.close();
}
public static void main(String[] args) {
new Main().run();
}
class FastScanner {
BufferedReader br;
StringTokenizer st;
public FastScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public FastScanner(String s) {
try {
br = new BufferedReader(new FileReader(s));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
String nextToken() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(nextToken());
}
long nextLong() {
return Long.parseLong(nextToken());
}
double nextDouble() {
return Double.parseDouble(nextToken());
}
}
}
|
cs |
반응형
'PS > Problem_Solving' 카테고리의 다른 글
[BOJ] 21237. Clockwise Fence (greedy) (0) | 2021.09.06 |
---|---|
[BOJ] 20652. Stuck in a Rut (simulation) (0) | 2021.08.30 |
[BOJ] 1744. 수 묶기(그리디).java (0) | 2021.04.07 |
[BOJ] 1783. 병든 나이트(그리디).java (0) | 2021.04.07 |
[BOJ] 4991. 로봇 청소기(BFS, 순열) (0) | 2021.01.18 |
댓글