ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JS에서 항상 찾아오는 시간초과...중복 제거 기능 사용하기 [...new Set()]
    Code Etc/코딩테스트 2022. 12. 7. 16:45
    반응형

    프로그래머스에서 신고 결과를 받는 문제였다.

    간략하게 설명하자면 다른 유저를 신고할 수 있고, 같은 유저를 신고해도 횟수는 1회만 적용된다.

    그리고 k횟수가 넘어가면 해당 유저는 정지되고 해당 유저를 신고한 유저는 신고완료 메일을 받는다.

     

    function solution(id_list, report, k) {
        let details = []
        for(let i = 0 ; i < id_list.length ; i++) {
            details.push({name : id_list[i], report : [], getMails : 0, count : 0})
        }
        const filteredReport = [];
        report.forEach((e) => {
            if(!filteredReport.includes(e)) {
                filteredReport.push(e)
            }});
        
       filteredReport.forEach(e => {
           let arr = e.split(' ');
           details.forEach((e) => {
               if(e.name === arr[0]) e.report.push(arr[1]);
               if(e.name === arr[1]) e.count++;
           })
       });

        const bannedUser = details.filter(e => e.count >= k).map(e => e.name);
        
        bannedUser.forEach((user) => {
            details.forEach((e) => {
                if(e.report.includes(user)) e.getMails++;
            })
        })
        
        return details.map((e) => e.getMails);
    }

     

    위 코드는 내가 사용한 코드인데

    details에 고유 유저id, 신고한 사람[report] 신고 받은 횟수(count) 받은 메일(getMails)로 구조를 나눴다.

     

    쭉 훑어보면 중복 신고는 안된다고 했으니 중복 제거하고

    중복 제거된 배열에서 신고자 신고 받은자에 따라서 details에 data넣어주고

    다 끝나면 정지된 유저를 걸러서 정지된 유저를 신고한 사람들에게 getMails++를 해주고 결과를 return했다.

     

    근데 시간초과가 났다..

    내가 봐도 forEach와 map을 많이 쓴 것 같지만 꼭 필요한 부분이라고 생각이 들었는데..

    이를 어떻게 하면 좋을까 생각해보고 구글링도 해보다가

    중복을 제거할 때 [...new Set()]이라는 기능을 사용했더니 시간초과 문제가 해결됐다.

     

    아래는 해결한 코드이니 참고 바란다. 코드 몇 줄로 성능이 좋아지는 경험을 한 점이 좋았다...

     

     

    function solution(id_list, report, k) {
        let details = []
        for(let i = 0 ; i < id_list.length ; i++) {
            details.push({name : id_list[i], report : [], getMails : 0, count : 0})
        }
        const filteredReport = [... new Set()];
        
       filteredReport.forEach(e => {
           let arr = e.split(' ');
           details.forEach((e) => {
               if(e.name === arr[0]) e.report.push(arr[1]);
               if(e.name === arr[1]) e.count++;
           })
       });

        const bannedUser = details.filter(e => e.count >= k).map(e => e.name);
        
        bannedUser.forEach((user) => {
            details.forEach((e) => {
                if(e.report.includes(user)) e.getMails++;
            })
        })
        
        return details.map((e) => e.getMails);
    }

    반응형

    댓글

Designed by Tistory.