본문 바로가기
Otter's [ 개발새발 ]/# 코딩테스트 - Programmers

[Programmers 코딩테스트 연습_Lv1_Python] 신고 결과 받기

by byeonPig 2022. 5. 30.

문제 주소: https://programmers.co.kr/learn/courses/30/lessons/92334

 

[ 문제 ]

 

[ 나의 귀여운 풀이 ]

def solution(id_list, report, k):
    reportedli = []
    # report를 split해 [[신고한 user id, 신고 당한 user id], ... ]로 구성
    cntli = [0] * len(id_list)
    # 각 user id 별 신고 누적 횟수 체크를 위한 list
    suspended = []
    # k 이상의 신고를 받은 user id를 저장 하기 위한 list
    result = [0] * len(id_list)
    # 받을 메일의 수를 id_list의 인덱스에 맞춰서 저장할 list

    report = list(set(report))
    # 중복을 제거하기 위해 집합자료형 set을 사용한다. set을 사용시 순서 고려 X

    for i in range(len(report)):
        reportedli.append(list(map(str, report[i].split())))
        # reportedli[idx][0] 신고한사람, reportedli[idx][1] 신고당한 사람

    for i in range(len(reportedli)):
        # id 별 신고 누적 횟수 체크
        idx = id_list.index(reportedli[i][1])
        cntli[idx] += 1

    for i in range(len(cntli)):
        # chkli에서 k 이상의 값 즉, k번 이상 신고를 당한 user id를 저장
        if cntli[i] >= k:
            suspended.append(id_list[i])

    for i in range(len(reportedli)):
        # suspended id list와 reported id list를 비교해 메일을 보낼 user id에 해당하는 index에 count해준다.
        if reportedli[i][1] in suspended:
            idx = id_list.index(reportedli[i][0])
            result[idx] += 1

    return result

 

[ 다른 분들의 유려한 코드 ]

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

 

[ 배운 것 ]

 

1. list 내 중복제거

 

처음에는 반복문을 두 겹으로 사용해 O(N^2) 시간 복잡도를 가진 방법으로 중복을 제거 했는데, 이 때문에 테스트에서 실패하는 케이스가 발생했다... ㅜㅜ

 

(1) 순서 고려 시

 

- for문 사용

for value in array:
    if value not in result:
        result.append(value)

 

-  dict.fromkeys(arr) 사용

result = list(dict.fromkeys(array))

 

(2) 순서 고려하지 않을 시

 

- 집합 자료형 set 사용

arr = list(set(arr))

참고: https://jsikim1.tistory.com/214

 

 

2. 자료형의 적절한 사용: 다른 분들의 풀이를 보면 나처럼 신고당한 사용자의 이름과 신고 받은 횟수를 따로 list로 보관하는 것이 아니라 dictionary 자료형으로 이름을 key, 신고당한 횟수를 value로 저장해 정지당한 사용자를 판별하는데, 이렇게 되면 suspended 리스트를 또 저장할 필요 없어진댜... set, dictionary 등 자료형을 알맞게 사용하는 것도 중요하다고 느꼈다.

 

꾸준히 열심히!