ProblemSolving/Hash

프로그래머스 신고 결과 받기 (파이썬)

OSNIM 2022. 5. 3. 14:46
반응형

Level 1 해시

 

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

 

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

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

programmers.co.kr

 

접근 방법 

이름을 key, 번호를 value로 하여 딕셔너리로 저장

각 ID 별로 2차원 배열을 생성 > reportList[i][j] i인덱스가 j인덱스를 신고를 했으면 1 안했으면 0

reportList를 같은 열끼리 더한 것이, k를 넘으면 reportList[i][j]가 1인 것만 answer[i] 1증가  

 

def findIdx(dic, name):
    idx = dic[name]
    return idx

def connetIdIdx(id_list):
    dic = {}
    for i in range(len(id_list)):
        dic[id_list[i]] = i
    return dic

def solution(id_list, report, k):
    answer = [0]*len(id_list)
    #[report 보낸 수, report 받은 수] 보냈으면 1, 안보냈으면 0
    reportList = [[0]*len(id_list) for _ in range(len(id_list))]
    dic = connetIdIdx(id_list)
    
    # 신고 당한 횟수 세기
    reportCntList = [0] * len(id_list)
    
    for re in report:
        str1, str2 = map(str, re.split())
        reporter = findIdx(dic, str1)
        reported = findIdx(dic, str2)
        if not reportList[reporter][reported]:
            reportList[reporter][reported] = 1
    
    for i in range(len(id_list)):
        for j in range(len(id_list)):
            reportCntList[i] += reportList[j][i]
    
    for i in range(len(reportCntList)):
        if reportCntList[i] >= k:
            for j in range(len(reportCntList)):
                if reportList[j][i]:
                    answer[j] += 1
                
    return answer

 

최적화 풀이

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

 

후기

처음에 쉬운 문제인 줄 알고 덥석 풀었는데 그래도 난이도가 있었습니다. 문제가 번호가 아닌 이름으로 주어져서 이를 처리하는데 조금 헤맸습니다.

딕셔너리를 처음 쓰다보니 검색을 하면서 풀었고 제가 새롭게 알게된 부분을 정리해보려고 합니다.

 

딕셔너리는 다른 자료형과 다르게 append로 추가하는 것이 아니라 = 연산자로 값을 추가합니다.

a = {}

a[key] = value

 

테케가 모두 맞았을 때 기분은 좋았는데 다른사람의 최적화된 풀이를 보니 너무 현타가 왔습니다.

제가 새롭게 배운 부분을 정리해볼까 합니다.

 

 

# 각 유저 ID를 key값으로 하고, value는 0으로 초기화

reports = {x : 0 for x in id_list}

 

# 리스트를 set변수에 넣어 중복값을 없앰
# 신고당한 id를 뽑아 신고당한 수 1 증가
    for r in set(report):
        reports[r.split()[1]] += 1

# id_list.index(n) : id_list 리스트에서 n의 인덱스 반환
    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer

반응형