Map Sum Pairs

Published by

on

Problem

https://leetcode.com/problems/map-sum-pairs/description/

Solution

class MapSum {

    class Node {
        Character key;
        int value;
        Map<Character, Node> childrenMap = new HashMap<>();
        
        Node(Character key) {
            this.key = key;
        }
        
        public Character getKey() {
            return this.key;
        }
        
        public int getValue() {
            return this.value;
        }
        
        public void setValue(int value) {
            this.value = value;
        }
        
        public Map<Character, Node> getChildrenMap() {
            return this.childrenMap;
        }
    }
    
    Node root;
    
    public MapSum() {
        root = new Node(null);
    }
    
    public void insert(String key, int value) {
        char[] keyCharArray = key.toCharArray();
        Node current = root;
        for (int i=0;i<keyCharArray.length;i++) {
            char c = keyCharArray[i];
            Map<Character, Node> childrenMap = current.getChildrenMap();
            if (childrenMap.containsKey(c)) {
                current = childrenMap.get(c);
            } else {
                Node node = new Node(c);
                childrenMap.put(c, node);
                current = node;
            }
            
            if (i == keyCharArray.length - 1) {
                current.setValue(value);
            }
        }
    }
    
    public int sum(String prefix) {
        char[] keyCharArray = prefix.toCharArray();
        Node current = root;
        for (int i=0;i<keyCharArray.length;i++) {
            char c = keyCharArray[i];
            Map<Character, Node> childrenMap = current.getChildrenMap();
            if (childrenMap.containsKey(c)) {
                current = childrenMap.get(c);
            } else {
                return 0;
            }
        }
        
        return getSum(current);
    }
    
    private int getSum(Node node) {
        Queue<Node> queue = new LinkedList<>();
        queue.add(node);
        int result = 0;
        while(!queue.isEmpty()) {
            Node n = queue.poll();
            result += n.getValue();
            
            for(Character key : n.getChildrenMap().keySet()) {
                Node child = n.getChildrenMap().get(key);
                queue.add(child);
            }
        }
        return result;
    }
}

/**
 * Your MapSum object will be instantiated and called as such:
 * MapSum obj = new MapSum();
 * obj.insert(key,val);
 * int param_2 = obj.sum(prefix);
 */
  • Trie 의 대표적인 문제
  • insert, search 의 pseudo code 는 기억해 놓자!

Leave a comment