Coding test

[KAKAO BLIND RECRUITMENT] 신고 결과 받기(python)

heedy 2022. 12. 16. 17:49
728x90

문제 설명


문제 풀이 과정

  1. 처음 문제를 보자마자 든 생각은 report를 set 처리하자! 였다.. 아무래도 중복을 먼저 처리하는 것이 가장 관건이라고 생각했다.
  2. 그 다음은 각 신고를 신고자 별로 dictionary형태로 만드는 것. 중복이 없으니 key를 신고자, value 값을 신고당한 사람으로 list로 만든 후 append 하는 것으로 결정함.
  3. 이제 신고 당한 횟수를 count해야 하는데, stop이라는 list를 만들어서 신고당한 사람을 넣었고, 그 중 k회 이상 신고당한 사람만 남도록 했다.
  4. 이제 dictionary에 있는 신고자와 신고 당한 사람을 각각 items로 풀어서 신고당한 사람이 stop에 있으면 count에 + 1 할 수 있도록 했다.
from collections import defaultdict
def solution(id_list, report, k):
    answer = []
    stop = []
    report = set(report)
    set_id = defaultdict(set)
    for i in id_list:
        set_id[f'{i}'] = []
    for i in report:
        a = i.split(' ')
        set_id[a[0]].append(a[1])
        stop.append(a[1])
    stop = [i for i in set(stop) if stop.count(i) >= k]
    for i, k in set_id.items():
        count = 0
        for j in k:
            if j in stop:
                count += 1
        answer.append(count)
    return answer

효율성이 약간 간당간당했는데.. 그래도 통과했다.. 이리저리 구조를 생각 많이 했다.

다른 사람 풀이

  1. id_list만큼 answer를 0으로 채우기
  2. id_list를 key, 0을 value로 채운 dictionary 만들기
  3. report 중복 제거 후 공백으로 나눈 후에, 신고 당한 사람을 +1 하기
  4. dictionary에서 value가 k회 이상인 값들 중 answer에 index 위치에 +1 해주기
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

이렇게까지 할 수 있구나..싶다..^^

 

- coding test url:

https://school.programmers.co.kr/learn/courses/30/lessons/92334

 

프로그래머스

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

programmers.co.kr

 

728x90