[Codetest] 프로그래머스 Lv1 - 신고 결과 받기

그냥·2022년 7월 21일
0

codetest

목록 보기
2/9

문제

신고 결과 받기



조건 정리

1) 2개의 리스트와 1개의 양의 정수를 인잘 받는다.
2) 양의 정수로 이루어진 리스트를 반환한다.
3) id_list는 ["muzi", "frodo", "apeach", "neo"] 처럼 이루어져 있다.
4) report는 띄어쓰기를 기준으로 앞이 신고자, 뒤가 피신고자로 이루어져 있다.
["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]


내 풀이

def solution(id_list, report, k):
    answer = []
    reporters = [report[i].split(' ')[0] for i in range(len(report))]
    reportees = [report[i].split(' ')[1] for i in range(len(report))]
    no_overlap_reportees = list(set(reportees))
    reportees_nums = [reportees.count(id) for id in no_overlap_reportees]
    reportees_and_nums = {
        reportees : nums for reportees, nums in zip(no_overlap_reportees, reportees_nums)
    }

    over_reportees = []
    for key, value in reportees_and_nums.items():
        if value >= 2:
            over_reportees.append(key)

    ters_tees = {}
    for reporter, reportee in zip(reporters, reportees):
        if ters_tees[reporter] == reportee
        ters_tees[reporter] = reportee

    return answer
  • 결과적으로는 풀지 못했다.
  • 풀지 못한 이유는 id_list, report, k가 서로 연결될 수 있게 리스트나 딕셔너리에 넣어야 되는데 그렇지를 못했다.
  • 가장 큰 이유는 report에서 한 명의 신고자가 여러 명의 피신고자와 연결되어 있는데 이를 딕셔너리에 value 값으로 리스트를 선언해서 여러 개의 값을 넣는 방법을 몰랐기 때문이다.


다른 풀이

from collections import defaultdict

def solution(id_list, report,k):
    answer = []
    # 중복 신고 제거
    report = list(set(report))
    # user별 신고한 id 저장
    user = defaultdict(set)
    # user별 신고당한 횟수 저장
    cnt = defaultdict(int)
	
    for r in report:
        # report의 첫번째 값은 신고자id, 두번째 값은 신고당한 id
        a,b = r.split()
        # 신고자가 신고한 id 추가
        user[a].add(b)
        # 신고당한 id의 신고 횟수 추가
        cnt[b] += 1
    print(f"user : {user}")
    print(f"cnt : {cnt}")

    for i in id_list:
        result = 0
        # user가 신고한 id가 k번 이상 신고 당했으면, 받을 메일 추가
        for u in user[i]:
            if cnt[u]>=k:
                result +=1
        answer.append(result)
    return answer

defaultdict

특징

  • 딕셔너리와 작동 방식은 거의 동일하다
  • defaultdict()의 인자로 주어직 객체의 기본값을 딕셔너리값의 초기값으로 지정할 수 있다(int, list, set 등)

int

from collections import defaultdict

int_dict = defaultdict(int)
int_dict
>> defaultdict(<class 'int'>, {})

int_dict['key1']
>> 0

defaultdict(<class 'int'>, {'key1': 0})
  • 위와 같이 key값인 key1만 주고 value를 주지 않을 경우 0을 default value로 할당한다.

list

from collections import defaultdict

list_dict = defaultdict(list)
list_dict
>> defaultdict(<class 'list'>, {})

list_dict['key1']
>> []
list_dict['key2'] = 'test1'
list_dict['key3'] = 'test2'
list_dict['key3'].append('test3')


defaultdict(
	<class 'list'>, 
	{
      'key1': [], 
      'key2' : 'test', 
      'key3' : ['test1', 'test2']
   }
)

0개의 댓글