코딩 문제 풀이/프로그래머스

[프로그래머스] 신고결과받기 (2022 KAKAO BLIND RECRUITMENT)

723poil 2022. 3. 2. 21:00

문제

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

풀이

 

소스코드

def solution(id_list, report, k):
    answer = []
    id_dict = dict()

    id_n = len(id_list)
    report_n = len(report)

    for i in range(id_n):
        id_dict.update({id_list[i]: i})

    for i in range(id_n):
        answer.append(0)

    check_dict = dict()
    mid_ans = [0 for _ in range(id_n)]
    for i in range(report_n):
        a, b = report[i].split(' ')

        if check_dict.get(report[i]) is not None:
            continue
        else:
            check_dict.update({report[i]: 0})
            mid_ans[id_dict[b]] += 1

    for i in range(id_n):
        if mid_ans[i] < k:
            mid_ans[i] = 0

    for i in check_dict:
        a, b = i.split(' ')

        if check_dict[i] == 0 and mid_ans[id_dict[b]] > 0:
            answer[id_dict[a]] += 1
            check_dict[a+ " " +b] += 1

    return answer

 

풀이과정 ( 접근과정 )

 오랜만에 문제를 풀려고 하다보니 파이썬 문법들이 자세하게 기억이 안나 리스트를 사용해서 풀었다.

답은 나왔었지만, 3개정도가 시간초과가 나서 다른 방식으로 풀어야겠다는 생각을 했다.

 

 그래서 파이썬의 dictionary 문법을 사용해 id_list에 있는 이름들에 숫자를 지정해주고, report 리스트를 검색해서 check_dict에 중복이 발생하는지 확인해가면서 넣어주면서 mid_ans 리스트에 신고당한 횟수를 각 이름에 맞게 1씩 더해주었다. 그리고 mid_ans리스트에서 k만큼의 수를 충족시키지 못했을 경우 0으로 초기화 해준 후, 다시 check_dict를 하나씩 검사해나가면서 answer 리스트에 해당하는 이름에 1씩 더해주어 문제를 풀었다.

 

아쉬운점

 문제를 맞추고, 다른 사람들이 푼 코드들을 살펴보니 내가 놓친 문법들이 많다는 것을 깨달았다.

나보다 코드가 간결하고 훨씬 가독성이 높아 배울 점이 많아 보였다.

 

 DICT선언

reports = {id : 0 for id in id_list}

dict 선언할때 미리 id를 넣어서 지정해줌으로써 코드의 길이를 줄이고, 시간을 줄일 수 있게 됨

 

 SET함수 사용

set(report)를 통해 중복이 되는 경우들을 제거 함으로써 코드가 더욱 간결해진다.

 

 list.index()함수사용

index값을 바로 가져와 사용하여, 내가 짰던 id_dict 변수를 사용한 방식보다 더 빠르다고 생각.

 

피드백 후 코드

def solution(id_list, report, k):
    answer = []
    n = len(id_list)
    
    for i in range(n):
        answer.append(0)
        
    reports = {id: 0 for id in id_list}
    
    for i in set(report):
        i = i.split(' ')
        reports[i[1]] += 1

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

확실히 코드들이 어떤 역할을 하는지 좀 더 쉽게 알 수 있었다.

 

후기

레벨1짜리 문제이기 때문에 많이 쉬울 것 같았지만, 거의 반년동안 쉬다가 풀어서 그런지 생각대로 잘 되지는 않았다.

나중에는 이런문제들이 확실히 쉽다고 느껴지겠지만, 그래도 문제풀이는 남기려고 한다. 나중에 내가 이 문제를 다시 풀어보면 또 다른 방식으로 문제를 풀거라고 생각하기 때문에 그때 이 글을 다시본다면 분명 도움이 될 거라고 생각한다.