Skip to content

399. Evaluate Division

#220

Problem link

https://leetcode.com/problems/evaluate-division/

Problem Summary

방정식과 결과 값이 주어질 때 방정식을 받아서 값을 계산하는 문제.

Solution

체인 형태로 연결되어 있는 것이 그래프가 생각났다.

a / c = (a / b) * (b / c)

위 식이 핵심인데, a - b - c 를 죽 이었을 때 a / c 의 답을 얻을 수 있다.

a -> b 의 간선은 a / b 의 값으로, b -> a 의 간선은 1 / (a / b) 로 값을 세팅한 후 쿼리가 오면 경로대로 곱해주면 답이다.
BFS 탐색으로 시작부터 끝까지 돌면서 나오는 값들을 다 곱해주었다. 예외 처리로 없는 값이 들어오는 것만 처리해주면 쉽게 풀린다.

Source Code

import math
from collections import defaultdict, deque
from typing import List


class Solution:
    def calcEquation(self, equations: List[List[str]], values: List[float], queries: List[List[str]]) -> List[float]:
        edges = defaultdict(list)

        for i in range(len(equations)):
            (a, b) = equations[i]
            edges[a].append((b, values[i]))
            edges[b].append((a, 1.0 / values[i]))

        def bfs(node, target):
            if len(edges[node]) == 0:
                return math.inf

            visited = defaultdict(bool)
            queue = deque([(node, 1.0)])
            visited[node] = True

            while queue:
                (current, value) = queue.popleft()

                if current == target:
                    return value

                for (next, mul) in edges[current]:
                    if visited[next]:
                        continue

                    queue.append((next, value * mul))
                    visited[next] = True

            return math.inf

        res = []
        for query in queries:
            result = bfs(query[0], query[1])
            res.append(result if result != math.inf else -1.0)

        return res