[Lv1] 신고 결과 받기

이말감·2022년 7월 15일
0

Programmers

목록 보기
12/32

프로그래머스 Lv1 신고 결과 받기

문제

링크

풀이

def solution(id_list, report, k):
    id_bad = {}
    id_mail = {}
    answer = {}
    for id in id_list :  # 1
        id_bad[id] = 0
        id_mail[id] = []
        answer[id] = 0
    for re in report :   
        a = re.split(' ')[0]
        b = re.split(' ')[1]
        if b not in id_mail[a] :
            id_bad[b] += 1  # 2 
            id_mail[a].append(b)  # 3
    for key, val in id_bad.items() :  # 4
        if val < k :
            continue
        for m_key, m_val in id_mail.items() :
            if key in m_val :
                answer[m_key] += 1
    return list(answer.values())

나의 풀이는 아주 단순하게 생각했다.
1. 딕셔너리 형태로 바꾸기 (인덱스를 문자로 사용하기 위해)
2. 캐릭터 별 신고 당한 횟수
3. 누굴 신고했는지
4. 신고당한 횟수가 k 이상일 때 3번 딕셔너리(id_mail)에 해당 캐릭터가 있는지 확인

코드가 너무 길고 필요 없는 코드가 많다.
다른 사람의 코드를 살짝 읽어보고 참고하여 새롭게 코드를 작성해봤다.

def solution(id_list, report, k):
    id_bad = {id : 0 for id in id_list} # 1
    answer = [0] * len(id_list)  # 2
    for re in set(report) :    # 3
        id_bad[re.split(' ')[1]] += 1  # 4
    for re in set(report) :  # 5
        if id_bad[re.split(' ')[1]] >= k :  # 6
            answer[id_list.index(re.split(' ')[0])] += 1
    return answer
  1. id_bad 딕셔너리는 유저 몇 번 신고를 당했는지 저장한다.
  2. answer는 정지 메일 발송 횟수 저장
  3. 문제 설명에서 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다. 로 인해 한 유저가 동일한 유저를 여러 번 신고할 경우가 있으므로 set을 통해 중복을 제거한다.
  4. id_bad에 각 유저 별 신고당한 횟수를 저장한다.
  5. 3과 동일하게 중복을 제거하고 반복문을 돌린다.(신고 내용)
  6. id_bad에 저장된 유저의 신고 횟수가 k 이상일 경우
  7. answer에 id_list를 통해 얻어낸 인덱스로 1을 더해준다.
  • 다시 report를 반복문 돌리는 이유는 이미 신고 횟수를 저장했기 때문에 그에 따라 메일을 받을 유저를 찾아야 하기 때문이다.
  • re.split(' ')[0]신고한 유저의 이름으로 id_list.index()으로 인덱스 값을 얻을 수 있다.

javascript

function solution(id_list, report, k) {
    const reportSet = [...new Set(report)];
    const bad = new Array(id_list.length).fill(0);
    for (let i=0; i<reportSet.length; i++) {
        bad[id_list.indexOf(reportSet[i].split(' ')[1])] += 1
    }
    const good = new Array(id_list.length).fill(0);
    for (let i=0; i<reportSet.length; i++) {
        good[id_list.indexOf(reportSet[i].split(' ')[0])] += bad[id_list.indexOf(reportSet[i].split(' ')[1])] >= k ? 1 : 0;
    }
    return good;
}
  • Set으로 중복 제거하고, 다시 리스트로 변경하는 방법
    • [...new Set(report)]
  • n개의 원소를 가지고, 모든 원소가 0인 배열 만들기
    • new Array(n).fill(0)
  • 배열 내 특정 값의 인덱스 구하기
    • array.indexOf(특정값)
profile
전 척척학사지만 말하는 감자에요

0개의 댓글