< All posts

811. Subdomain Visit Count

문제 μ„€λͺ…

ν•΄λ‹Ή λ¬Έμ œλŠ” 도메인 λ°©λ¬Έ νšŸμˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 각 μ„œλΈŒλ„λ©”μΈμ˜ λ°©λ¬Έ 횟수λ₯Ό κ΅¬ν•˜μ—¬ μ΅œμ’…μ μœΌλ‘œ λͺ¨λ“  도메인과 μ„œλΈŒλ„λ©”μΈμ˜ λ°©λ¬Έ 횟수λ₯Ό λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

811

풀이 및 ν•΄μ„€

기본적으둜 ν‚€-λ°Έλ₯˜λ₯Ό μ €μž₯ν•˜λŠ” ν•΄μ‹œλ§΅μ„ ν™œμš©ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

  1. 각 도메인 λ°©λ¬Έ 횟수λ₯Ό μˆœνšŒν•©λ‹ˆλ‹€.
  2. 도메인을 1차적으둜 λ„μ›€ν‘œλ‘œ λΆ„λ¦¬ν•˜μ—¬ λ°©λ¬Έ νšŸμˆ˜μ™€ 도메인을 λΆ„λ¦¬ν•©λ‹ˆλ‹€.
  3. 도메인을 2차적으둜 점(.)으둜 λΆ„λ¦¬ν•˜μ—¬ μ„œλΈŒλ„λ©”μΈλ“€μ„ μΆ”μΆœν•©λ‹ˆλ‹€.
  4. 각 μ„œλΈŒλ„λ©”μΈμ— λŒ€ν•΄ λ°©λ¬Έ 횟수λ₯Ό ν•΄μ‹œλ§΅μ— λˆ„μ ν•©λ‹ˆλ‹€. 4-1. λ§Œμ•½ μ„œλΈŒλ„λ©”μΈμ΄ ν•΄μ‹œλ§΅μ— μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ μƒˆλ‘œ μΆ”κ°€ν•©λ‹ˆλ‹€. 4-2. 이미 μ‘΄μž¬ν•˜λ©΄ κΈ°μ‘΄ 값에 λ°©λ¬Έ 횟수λ₯Ό λ”ν•©λ‹ˆλ‹€.
  5. μ΅œμ’…μ μœΌλ‘œ ν•΄μ‹œλ§΅μ˜ ν‚€-λ°Έλ₯˜ μŒμ„ "방문횟수 μ„œλΈŒλ„λ©”μΈ" ν˜•μ‹μ˜ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ 리슀트둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.
class Solution:
    def subdomainVisits(self, cpdomains: List[str]) -> List[str]:
        doms = defaultdict(list)
        
        for cpdomain in cpdomains:
            count, domain = cpdomain.split()
            count = int(count)
            subdomains = domain.split(".")
            
            sd_n = len(subdomains)
            parsed_sd = []
            for i in range(sd_n-1, -1, -1):
                parsed = ".".join(subdomains[i:sd_n])
                parsed_sd.append(parsed)

            for subdomain in parsed_sd:
                if subdomain in doms.keys():
                    doms[subdomain] += count
                else:
                    doms[subdomain] = count

        
        ans = []
        for k,v in zip(doms, doms.values()):
            ans.append((str(v) + " " + k))

        return ans

ν’€κΈ΄ ν–ˆμœΌλ‚˜ λ‹€μ†Œ μ§€μ €λΆ„ν•˜κ²Œ μ½”λ“œλ₯Ό 짰기에 κ°œμ„ μ„ ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 ν•΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

2μ°¨ 풀이

κ°œμ„ μ‚¬ν•­:

  • defaultdictλ₯Ό ν™œμš©ν•˜κ³  있기 λ•Œλ¬Έμ— ν‚€ 쑴재 μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” 뢀뢄을 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • defaultdict(int)λ₯Ό μ‚¬μš©ν•˜μ—¬ list λŒ€μ‹  기본값을 0으둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • -1λΆ€ν„° 0κΉŒμ§€ μ—­μˆœμœΌλ‘œ μˆœνšŒν•˜λŠ” λŒ€μ‹ , list μŠ¬λΌμ΄μ‹±μ„ ν™œμš©ν•˜μ—¬ μ„œλΈŒλ„λ©”μΈμ„ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λ ‡κ²Œ μˆ˜μ •ν•˜λ‹ˆκΉŒ ν•œκ²° κ°„κ²°ν•΄μ§„ μ½”λ“œκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

class Solution:
    def subdomainVisits(self, cpdomains: List[str]) -> List[str]:
        doms = defaultdict(int)
        
        for cpdomain in cpdomains:
            count, domain = cpdomain.split()
            count = int(count)
            subdomains = domain.split(".")
            
            for i in range(len(subdomains)):
                subdomain = ".".join(subdomains[i:])
                doms[subdomain] += count
        
        return [f"{count} {domain}" for domain,count in doms.items()]

Complexity Analysis

tc

μ‹œκ°„ λ³΅μž‘λ„

O(n * m); n은 cpdomains 리슀트의 길이, m은 λ„λ©”μΈμ˜ μ΅œλŒ€ κΈΈμ΄μž…λ‹ˆλ‹€. 각 도메인에 λŒ€ν•΄ μ„œλΈŒλ„λ©”μΈμ„ μƒμ„±ν•˜κ³  ν•΄μ‹œλ§΅μ— μ ‘κ·Όν•˜λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„μž…λ‹ˆλ‹€.

곡간 λ³΅μž‘λ„

O(k); kλŠ” κ³ μœ ν•œ μ„œλΈŒλ„λ©”μΈμ˜ μˆ˜μž…λ‹ˆλ‹€. ν•΄μ‹œλ§΅μ— μ €μž₯λ˜λŠ” 도메인과 μ„œλΈŒλ„λ©”μΈμ˜ μˆ˜μ— λΉ„λ‘€ν•©λ‹ˆλ‹€.

Constraint Analysis

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, 10^4].
d1i, d2i, and d3i consist of lowercase English letters.

References

Β© 2025 HyunJoon Sung. All Rights Reserved.

GitHub