[Programmers] level 1 - 신고 결과 받기 (2022 KAKAO BLIND RECRUITMENT)

👩🏻‍💻 문제

문제가 이해는 갔는데 어떤 식으로 짜야 효율적인지 생각하는 게 어려웠다... 아직도 파이썬으로 문제 푸는 것에 익숙하지 않은가


👩🏻‍💻 정답 코드

def solution(id_list, report, k):
    reported = [[]*len(id_list) for _ in range(len(id_list))]
    report.sort()

    for i in range(len(report)):
        a, b = report[i].split()
        if report[i] != report[i-1]:
            reported[id_list.index(b)].append(id_list.index(a))
        
    answer = [0]*len(id_list)
    for i in reported:
        if len(i) >= k:
            for j in i:
                answer[j] += 1
            
    return answer

내가 처음 짠 코드는 위와 같았다. 하지만 테스트 22, 23에서 계속 실패 ㅠㅠ 내 생각에는 신고가 한 개가 들어왔을 때를 처리를 안 해서 그런 것 같다. 또 다른 문제가 있었겠지...
반복문도 너무 많고 해서 찾아보다가 집합을 활용한 풀이를 봤다.

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

reports{'prodo': 0, 'apeach': 0...} 이런 식으로 초기화한다. 그리고 중복을 없애기 위해 set() 안에 report를 넣어 집합으로 처리했다.
첫번째 for문에서 reports 내 신고 당한 사람의 value를 하나씩 높여 줬다. 그 다음 for문에서는 이미 set(report)을 한 바퀴 돌고 똑같이 한 번 더 돌면서 신고 받은 사람의 그동안 쌓인 신고가 k개 이상인 경우 이 사람을 신고한 사람의 indexanswer에서 증가시켜준다.


👩🏻‍💻 Remember

중복 제거는 집합으로
저장까지 굳이 인덱스로 하려고 하지 않아도 됨. 어차피 이름 중복 없으니까 코드만 길어진다. 그리고 다양한 데이터 자료형을 활용하자.

좋은 웹페이지 즐겨찾기