Leetcode Java Evaluate Division
업데이트:
문제
코드
class Solution {
public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
Map<String, Map<String, Double>> map = new HashMap<>();
for (int idx = 0; idx < values.length; idx++) {
List<String> equation = equations.get(idx);
map.putIfAbsent(equation.get(0), new HashMap<>());
map.putIfAbsent(equation.get(1), new HashMap<>());
map.get(equation.get(0)).put(equation.get(1), values[idx]);
map.get(equation.get(1)).put(equation.get(0), 1 / values[idx]);
}
double[] result = new double[queries.size()];
for (int idx = 0; idx < queries.size(); idx++) {
List<String> query = queries.get(idx);
result[idx] = this.dfs(query.get(0), query.get(1), 1, map, new HashSet<>());
}
return result;
}
private double dfs(String s, String t, double num, Map<String, Map<String, Double>> map, Set<String> set) {
if (!map.containsKey(s) || !set.add(s)) {
return -1;
} else if (s.equals(t)) {
return num;
} else {
Map<String, Double> next = map.get(s);
for (String str : next.keySet()) {
double result = this.dfs(str, t, num * next.get(str), map, set);
if (result != -1) {
return result;
}
}
return -1;
}
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(nums);
* int param_1 = obj.pick(target);
*/
결과
설명
- 쌍으로 이루어진 문자열 List인 equations과 숫자 List인 values가 주어지면, query의 계산 결과를 구하는 문제이다.
- $equations[i] = [Ai, Bi]$일 때, $Ai / Bi = values[i]$를 만족한다.
- $queries[j] = [Cj, Dj]$일 때, $Cj / Dj = result[i]$를 만족하는 값들을 구한다.
- 단, 값을 유추할 수 없는 경우 -1.0을 반환한다.
-
equations와 values를 엮어 저장 할 map을 HashMap으로 초기화한다.
- 0부터 values의 개수 이전까지 idx를 증가시키며 map에 값을 넣어준다.
- equations의 idx번째 List를 equation에 임시로 넣어준다.
- equations의 각 값들이 key가되는 value가 map에 존재하지 않을 경우, 새 HashMap을 넣어준다.
- map에서 equation의 첫 번째 값이 key인 Map을 꺼내와서, equation의 두 번째 값과 values의 idx번째 값을 key와 value로 엮어 넣어준다.
- map에서 equation의 두 번째 값이 key인 Map을 꺼내와서, equation의 첫 번째 값과 values의 idx번째 값을 1로 나눈 결과를 key와 value로 엮어 넣어준다.
-
결과를 저장할 result 배열을 queries의 개수의 크기로 초기화한다.
- 0부터 queries의 개수 이전까지 idx를 증가시키며 result에 값을 넣어준다.
- queries의 idx번째 List를 query에 넣어준다.
- result의 idx번째 값에 6번에서 정의한 dfs(Map<String, Map<String, Double» map, Set
set, String q1, String q2, double num) 메서드의 수행 결과를 넣어준다.
- result에 값을 넣기 위한 dfs(Map<String, Map<String, Double» map, Set
set, String q1, String q2, double num) 메서드를 정의한다. - map에 q1이 존재하지 않거나 set에 q1이 존재하지 않는 경우 결과를 판단할 수 없으므로, -1을 반환한다.
- q1과 q2가 동일한 경우 두 값의 나눈 값은 1이므로, num을 그대로 반환한다.
- map에서 q1에 해당하는 Map을 next에 넣어주고 아래를 수행한다.
- next의 keySet을 str로 반복을 수행하여 str과 q2, num에 next의 str이 key인 값의 값을 가져와 곱하여 재귀 호출을 수행하여 -1이 아닌 경우, 해당 값을 반환한다.
- 반복이 정상적으로 완료되면 유추 가능한 값이 존재하지 않는다는 의미이므로, -1을 반환한다.
- 5번의 반복이 완료되면 결과를 저장한 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기