티스토리 뷰

반응형
 

프로그래머스

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

programmers.co.kr

def solution(id_list, report, k):
    answer = [0] * len(id_list)
    reports = {x : 0 for x in id_list}

    for r in set(report):
        reports[r.split()[1]] += 1

    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer

문제에서 요구하는 것은 각 유저별로 처리 결과 메일을 받은 횟수를 리턴하는 것이다.

따라서 일단 answer을 숫자를 넣을 수 있는 id 리스트로 만들어준다.

그리고 리포트를 dict 형태로 초기화 시켜주는데, list comprehension을 이용해서 각각 이름을 설정해주면 된다.

reports = {x : 0 for x in id_list}
print(reports)

>{'muzi': 0, 'frodo': 0, 'apeach': 0, 'neo': 0}

 

for 루프에서 report에 있는 이름을 돌면서, 이름에 맞는 dict의 value에 1씩 추가해준다.

들어가는 report를 set으로 만들어주는 이유는 중복을 제거하기 위해서이다.

이렇게 하면 if문을 사용하지 않고도 개수를 추가해줄 수 있다.

신고받은 이름은 report에서 split해서 만들어주면 1번 인덱스에 있으므로 r.split()[1]과 같이 써준다. 그러면 신고받은 이름이 reports의 괄호 안에 들어간다.

 

for r in set(report):
       reports[r.split()[1]] += 1
print(reports)

> {'muzi': 1, 'frodo': 2, 'apeach': 0, 'neo': 2}  #신고당한 유저들이 받은 신고 횟수

 

이제 마지막으로 for 루프를 돌면서 '신고한' 유저에게 결과를 돌려주면 된다.

신고한 유저는 report 리스트의 r.split()[0]에 있을 것이다. 따라서 reports에 있는 결과가 k번이 넘어갈 경우 r.split()[0]의 이름이 있는 인덱스에 1을 더해주면 간단하게 문제를 풀 수 있다.

 for r in set(report):
        if reports[r.split()[1]] >= k:  #만약에 그 유저가 신고당한 횟수가 k번이 넘어간다면
            answer[id_list.index(r.split()[0])] += 1 #신고한 유저에게 메일 추가

 

해싱을 이용한다는 아이디어가 떠오른다면 짧게 코드를 짤 수 있지만, 아니라면 리스트로 풀려고 힘이 좀 쓰였을 것이다.

자료구조를 공부하며 해싱의 의미와 dict 구조를 잘 알아두도록 하자. 해싱은 특히 문자열과 숫자를 동시에 다룰 때 유용하게 쓰인다.

반응형