N

(Leet Code JS)Subdomain Visit Count 본문

Leet Code 알고리즘

(Leet Code JS)Subdomain Visit Count

naeunchan 2021. 11. 6. 15:21
728x90
반응형

811. Subdomain Visit Count

 

A website domain "discuss.leetcode.com" consists of various subdomains. At the top level, we have "com", at the next level, we have "leetcode.com" and at the lowest level, "discuss.leetcode.com". When we visit a domain like "discuss.leetcode.com", we will also visit the parent domains "leetcode.com" and "com" implicitly.

A count-paired domain is a domain that has one of the two formats "rep d1.d2.d3" or "rep d1.d2" where rep is the number of visits to the domain and d1.d2.d3 is the domain itself.

  • For example, "9001 discuss.leetcode.com" is a count-paired domain that indicates that discuss.leetcode.com was visited 9001 times.

Given an array of count-paired domains cpdomains, return an array of the count-paired domains of each subdomain in the input. You may return the answer in any order.

 

Example 1:

Input: cpdomains = ["9001 discuss.leetcode.com"] Output: ["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"] Explanation: We only have one website domain: "discuss.leetcode.com". As discussed above, the subdomain "leetcode.com" and "com" will also be visited. So they will all be visited 9001 times.

Example 2:

Input: cpdomains = ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"] Output: ["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"] Explanation: We will visit "google.mail.com" 900 times, "yahoo.com" 50 times, "intel.mail.com" once and "wiki.org" 5 times. For the subdomains, we will visit "mail.com" 900 + 1 = 901 times, "com" 900 + 50 + 1 = 951 times, and "org" 5 times.

 

Constraints:

  • 1 <= cpdomain.length <= 100
  • 1 <= cpdomain[i].length <= 100
  • cpdomain[i] follows either the "repi d1i.d2i.d3i" format or the "repi d1i.d2i" format.
  • repi is an integer in the range [1, 104].
  • d1i, d2i, and d3i consist of lowercase English letters.

 

1차적으로 주어진 cpdomains 배열을 rep과 domains로 나눠야 한다.

공백으로 이뤄져 있기 때문에 split()을 이용해 각각 rep과 domains로 분리.

rep은 방문 횟수를 뜻하기 때문에 string을 parseInt() 함수를 이용해 number로 변환한다.

 

이제 분리된 domains를 뒤에서부터 잘라 .으로 이어주면 된다.

slice()로 domains을 자르는데, '-'를 붙여 뒤에서부터 차례대로 분리한 뒤, "."으로 join을 한다.

 

join 된 문자열을 key로 삼고,

이 key가 map에 있는지 확인하고 있으면 해당 value를, 없으면 빈 배열 []을 가지도록 한다.

해당 도메인인 key를 map에 저장하는데, [...value, rep]을 하여 방문 횟수를 도메인에 저장한다.

 

마지막으로 map을 순회하면서 모든 방문 횟수를 더해 도메인별 방문 횟수를 구하면 된다.

 

const subdomainVisits =(cpdomains) => {
    const answer = [];
    const map = new Map();
    
    for(let i = 0; i < cpdomains.length; i++){
        const splitedString = cpdomains[i].split(" ");
        const rep = parseInt(splitedString[0]);
        const domains = splitedString[1].split(".");
        
        for(let j = 0; j < domains.length; j++){
            const key = domains.slice(-j).join(".");
            const value = map.get(key) ?? [];
            
            map.set(key, [...value, rep]);
        }
    }
    
    for(const [key, value] of map){
        let sum = 0;
        
        for(let i = 0; i < value.length; i++){
            sum += value[i];
        }
        
        answer.push(`${sum} ${key}`);
    }
    
    return answer;
};
728x90
반응형