cording test

Lv.1 신고 결과 받기

JM Lee 2023. 5. 17. 21:41
728x90

코딩테스트 연습 - 신고 결과 받기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

이틀 연속 카카오 문제..

 

카카오 문제의 특징이 보편적으로 그런지는 모르겠지만,

지문이 길다 보니 지문 속에서 함수 힌트를 제공한다.

# 팀원끼리 풀어본 문제

def solution(id_list, report, k):

    note={}
    banner=[]
    for i in set(report):
        a=i.split(" ") # 리포트를 신고자와 피신고자로 분리해서 리스트화
        try:
            note[a[0]] += [a[1]]
        except:
            note[a[0]] = [a[1]] # try/except 문 사용
        banner.append(a[1])
    print(note)
    print(banner)
    
    ban_report={} # 신고당한 횟수를 저장할 딕셔너리
    for i in id_list:
        ban_report[i]=0 
    for ban in banner:
        ban_report[ban] +=1 #신고당한 횟수 카운트
    
    print(ban_report)
    pause=[] # 정지대상을 저장할 리스트
    for i in id_list:
        if ban_report[i] >= k:
            pause.append(i)
    print(pause)
    
    for i in id_list:
        ban_report[i]=0
    for key,value in note.items(): # 신고자: 피신고자 명단
        for i in pause: 
            if i in value:
                ban_report[key] +=1
    answer = list(ban_report.values())
    return answer
# 리팩토링 코드

def solution(id_list, report, k):

    report = set(report) # 중복된 신고 무시
    ban_report={} #신고자 매칭
    ban_count={} #신고당한 횟수
    result={} #유저당 이메일 수신 횟수를 담을 딕셔너리
    for i in id_list:
        ban_report[i]=[]
        ban_count[i]=0
        result[i]=0

    for i in report:
        a=i.split(" ") 
        ban_report[a[0]] += [a[1]] 
        ban_count[a[1]] += 1
    
    pause=[] # 정지대상을 저장할 리스트
    for key,value in ban_count.items():
        if value >= k: # 신고당한 횟수가 기준치 k를 넘긴다면 정지명단에 추가
            pause.append(key)
    
    for key,value in ban_report.items(): # 신고자: 피신고자 명단
        for i in pause: 
            if i in value:
                result[key] +=1
    answer = list(result.values())
    return answer
# 다른 사람의 코드

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
    
    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 클래스의 생성자로 기본값을 생성해주는 함수를 넘기면,

모든 키에 대해서 값이 없는 경우 자동으로 생성자의 인자로 넘어온 함수를 호출하여 그 결과값으로 설정함.

 

동시에 사전의 기본값 처리 코드를 제거할 수 있어서 편함.

'cording test' 카테고리의 다른 글

Lv.0 코드 처리하기  (0) 2023.05.20
Lv.1 체육복  (0) 2023.05.20
Lv.1 신규 아이디 추천  (0) 2023.05.17
LV.2 영어 끝말잇기  (0) 2023.05.07
LV.1 기사단원의 무기  (0) 2023.05.07