[PS] 99ํด๋ฝ ์ฝํ ์คํฐ๋ 25์ผ์ฐจ TIL (Evaluate Division)
ํ๊ทธ: 99ํด๋ฝ, PS, TIL, ๊ทธ๋ํ, ์ฝ๋ฉํ ์คํธ์ค๋น, ํญํด99
์นดํ ๊ณ ๋ฆฌ: PS
๋ฌธ์
์ค๋ช
์ฐ์ ์
๋ ฅ์ผ๋ก ๋ค์ด์ค๋ equations ๋ฆฌ์คํธ์ ๊ฐ ํญ๋ชฉ์๋ ๋ฌธ์์ด์ด ๋ค์ด์๊ณ , equations[i] = [a, b]
๋ผ๊ณ ํ๋ฉด values ๋ฐฐ์ด์๋ a / b = values[i]
๊ฐ์ด ์
๋ ฅ์ผ๋ก ๋ค์ด์จ๋ค.
์ฆ b์ ๋ํ a์ ๋น์จ์ด ์ฃผ์ด์ง๋ค.
์ผ๋จ ์ด ๋ฌธ์ ์ ํ์ด ๊ทธ๋ํ ์ธ์ง ํ์ ํ๋ ๊ฒ๋ถํฐ ์ด๋ ต๋ค.. ์์ ๋ฅผ ๋ณด๋ฉด a / b = 2 ์ด๊ณ , b / c = 3 ์ผ ๋, a / c ์ ๋ํ ๊ฒฐ๊ณผ 6 ์ ๋ฆฌํดํ๋ฉด ๋๋ ์์ด๋ค.
์ด ๋ฌธ์ ํด์์ ํต์ฌ์ a / b = 2 ์ด๋ฉด b / a = 1/2 ๋ผ๋ ๊ฒ์ ํ์ ํ๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ค. ์ฆ ์๋์ ๊ฐ์ ๋ฐฉํฅ์ฑ ์๋ ๊ฐ์ค์น ๊ทธ๋ํ ๋ฌธ์ ์ ๊ฐ๋ค.
1
2
a --2--> b --3--> c
a <--1/2-- b <--1/3-- c
๊ทธ๋ํ์ ๋
ธ๋ ์ ๋ณด๋ง ๋ฃ์ด์๋ ์๋๊ณ , ๊ฐ์ค์น ์ ๋ณด๋ ๊ฐ์ด ๋ฃ์ด์ค์ผ ํ๋ค. ๋ํ ๋
ธ๋ ์ด๋ฆ์ด โaโ, โbโ ๋ฑ๊ณผ ๊ฐ์ ๋ฌธ์๋ก ๋ค์ด์ค๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ก ์ฐพ๋๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ์ธ์ ๋ฆฌ์คํธ ์ ์ ์ int[][]
๋, ArrayList<Integer>[]
๊ฐ์ ํํ๊ฐ ์๋๋ผ Map
์ ํํ๋ก ์ ์ธํด์ผ ํ๋ค.
1
2
// {a={b=2.0}, b={a=0.5, c=3.0}, c={b=0.3333333333333333}} ์ ๊ฐ์ ํํ๋ก ์ ์ฅ๋๋ค
Map<String, Map<String, Double>> graph = new HashMap<>();
ํ์ด
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
public class Solution {
// ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ๋ก ํํ
private Map<String, Map<String, Double>> graph = new HashMap<>();
public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
// ๊ทธ๋ํ๋ฅผ ๊ตฌ์ฑ
buildGraph(equations, values);
double[] result = new double[queries.size()];
for (int i = 0; i < queries.size(); i++) {
String numerator = queries.get(i).get(0);
String denominator = queries.get(i).get(1);
result[i] = dfs(numerator, denominator, new HashSet<>());
}
return result;
}
private void buildGraph(List<List<String>> equations, double[] values) {
for (int i = 0; i < equations.size(); i++) {
String numerator = equations.get(i).get(0);
String denominator = equations.get(i).get(1);
double value = values[i];
graph.putIfAbsent(numerator, new HashMap<>());
graph.putIfAbsent(denominator, new HashMap<>());
graph.get(numerator).put(denominator, value);
graph.get(denominator).put(numerator, 1.0 / value);
}
}
private double dfs(String current, String target, Set<String> visited) {
if (!graph.containsKey(current) || !graph.containsKey(target)) {
return -1.0;
}
if (current.equals(target)) {
return 1.0;
}
visited.add(current);
Map<String, Double> neighbors = graph.get(current);
for (String neighbor : neighbors.keySet()) {
if (!visited.contains(neighbor)) {
double result = dfs(neighbor, target, visited);
if (result != -1.0) {
return result * neighbors.get(neighbor);
}
}
}
return -1.0;
}
}
ํ๊ณ
๊ทธ๋ํ ๋ฌธ์ ์ ํ์ ๋ง์ด ์ ํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค. ํนํ ์ ๊ทธ๋ํ ๋ฌธ์ ์ธ์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๊ณ , ๊ทธ๋ํ๋ฅผ ์ ์ธ ์ ์ด๋ค ํํ๋ก ๋ง๋ค ๊ฒ์ธ์ง๋ ์๊ฐํด ๋ด์ผ ๋ ๊ฒ ๊ฐ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ