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

zzzzsb·2022년 1월 19일
0

프로그래머스

목록 보기
1/33

문제링크

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


input & output

id_listreportkresult
["muzi", "frodo", "apeach", "neo"]["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]2[2,1,1,0]
["con", "ryan"]["ryan con", "ryan con", "ryan con", "ryan con"]3[0,0]


Approach #1

신고횟수 제한x.
한유저 여러번 신고할수 있으나, 이때는 신고횟수 1회로 처리.
k번이상 신고된 유저는 게시판 이용 정지, 신고한사람에게 정지사실 메일링(마지막에 한꺼번에).

id_list=["muzi", "frodo", "apeach", "neo"]	
report=["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]	
k=2	
answer=[2,1,1,0];

신고한 사람 맵
muzi : frodo(1), neo(3) -> 2
frodo : neo(3) -> 1
apeach : frodo(1), muzi(0) -> 1
neo :
-> return [2,1,1,0]      

신고당한 횟수 배열
muzi frodo apeach neo
 1     2           2
 
 frodo, neo 정지됨.

Solution #1

function solution(id_list, report, k) {
    //동일유저 신고횟수가 여러번일경우, 1회로 처리되므로 배열에서 중복값을 제거
    const set = new Set(report);
    const newReport = [...set];
    
    //key: 유저ID, value:[id_list에서 유저가 신고한 ID의 index] 맵 생성
    const map = new Map();
    for(let i=0; i<newReport.length; i++){
        let [user, reportedUser] = newReport[i].split(" ");
        const reportedUserIdx = id_list.indexOf(reportedUser); 
        if(map.has(user)){
            map.get(user).push(reportedUserIdx);
        }
        else{
            map.set(user, [reportedUserIdx]);
        }
    }
    
    //신고받은 횟수를 저장하는 배열
    const reportedArr = new Array(id_list.length).fill(0);
    for(let i=0; i<newReport.length; i++){
        let [user, reportedUser] = newReport[i].split(" ");
        let reportedUserIdx = id_list.indexOf(reportedUser);
        reportedArr[reportedUserIdx]++;
    }
    
    //신고받은 횟수가 k회 이상이면 answer 배열-> 신고한 유저아이디의 index자리에 ++
    let answer = new Array(id_list.length).fill(0);
    for(let i=0; i<reportedArr.length; i++){
        for(let [user, reportedUserArr] of map){
            let userIdx = id_list.indexOf(user);
            if(reportedArr[i]>=k && reportedUserArr.includes(i)){
                answer[userIdx]++;
            }
        }
    }
    return answer;
}

Time Complexity

O(3R)+O(RKV)

Space Complexity

O(R)+O(M)+O(2L)


Review

  1. 자바스크립트로 처음 풀어보는 프로그래머스 문제.
    릿코드랑 유형이 너무 달라서 놀랐다. -> 문제 설명이 되게 길다.... 이해하는데 시간 꽤 걸림.
  2. 문자열 관련 함수 공부를 많이 해야할것 같다고 느낌.
    array, map, set 도........ 진짜진짜.
  3. 풀긴 풀었지만 노가다st인 느낌이 강하고, optimal 하지 않은것 같아 새로 다시 풀어봐야 할 것 같다.
  4. 레벨 1은 호로록 풀줄 알았는데. 아직 공부가 많이 부족한 것 같다.ㅠㅠㅠ 힘내자아

TIL

  1. 공백 기준으로 문자열 자르기. string.split(" ");
  2. 해당 문자가 배열에서 몇번째 인덱스인가? 찾기-> arr.indexOf(curChar);
  3. 해당 문자나 숫자가 배열에 존재하는가? -> arr.includes(curChar) -> 존재하면 true.
  4. 배열에서 중복요소 제거하는 방법.
  • set의 특징을 이용한다.
  const set = new Set(dupArr);
  const Arr = [...set];
profile
성장하는 developer

0개의 댓글