Study & Project ✏️/프로그래머스 PCCP 공부 📅

[프로그래머스] Hash 자료구조 복습 및 실습문제(신고 결과 받기) 풀이 - 파이썬

JM 2022. 11. 8. 00:51
반응형

📖 문제

 

📃 코드

import collections

# id_list = ["muzi", "frodo", "apeach", "neo"]
# report = ["muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"]
# k = 2
    
def solution(id_list, report, k):
  answer = []

  # remove repeated report
  report = list(set(report))
  # prevent duplicated reported user name
  reportHash = collections.defaultdict(set)
  # counting how many reported user 
  stopped = collections.defaultdict(int)

  for x in report:
    # x = "muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"

    a, b = x.split(' ')
    # a = muzi, b = frodo ...

    reportHash[a].add(b)
    # reportHash = {'frodo': {'neo'}, 'muzi': {'neo', 'frodo'}, 'apeach': {'frodo', 'muzi'}})

    stopped[b] += 1
    # stopped = {'neo': 2, 'frodo': 2, 'muzi': 1})

  # if report counting >= k, user is Finally stopped & mail to report user
  for name in id_list:
    # name = "muzi", "frodo", "apeach", "neo"

    mail = 0
    for reported_user in reportHash[name]:
      # reported_user = 'neo'..., value is possible multi values

      if stopped[reported_user] >= k:
        # stopped[reported_user] mean = how many noe is reported?
        mail += 1

    # for each names
    answer.append(mail)

  return answer

✔️ 복습

import collections

def solution(id_list, report, k):
    answer = []
    report = list(set(report))
    reportHash = collections.defaultdict(set)
    stopped = collections.defaultdict(int)
    
    for idx, value in enumerate(report):
        reporter, reported = value.split()
        reportHash[reporter].add(reported)
        stopped[reported] += 1
        
    for name in id_list:
        mail = 0
        for reported in reportHash[name]:
            if stopped[reported] >= k:
                mail += 1
        answer.append(mail)

    return answer

 

🗝️ 요약

[개념]

키와 밸류가 한쌍인 자료구조가 필요한 경우에 Hash를 사용한다.

Python에서는 Dictionary인 Collections.Defaultdict()를 사용한다.

Collections.Defaultdict(set)은 Dictionary의 생성자를 set으로 생성한다.

[활용]
문자열이나, 문자를 키로 하고 거기에 대응되는 밸류 값을 한 쌍의 정보로서 저장 -> 해쉬

문자(어떤 자료형이든 가능)나 문자열을 빈도수 카운팅 할 때,

문자열을 키로 해서 자료구조를 대응시킬 때 해쉬를 이용