Algorithm Study 2022-06-18

저요·2022년 6월 18일

알고리즘 스터디

목록 보기
2/3

2022-06-18 알고리즘 스터디 1회차

문제 1 - 신고 결과 받기

validarity : 20.8%
language : javascript
link : 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기

문제 키워드

  1. Set 객체의 사용
  2. Hash 자료구조의 사용

나의 답

function solution(id_list, report, k) {
    var checkData = ""; // 중복 데이터 체크
    var checkList = []; // 체크할 리스트 생성
    
    var reportArr = []; // 신고한 사람과 신고당한 사람 리스트 (분리)
    var stopUser = [];
    var mailList = [];
    var answer = [];
    
    checkList = report;
    
    //중복 삭제 데이터
    for(i=0; i<report.length; i++){
        checkData = report[i];
        
        let checkIndex = checkList.indexOf(checkData, i+1)
        if(checkIndex != -1){
            checkList.splice(checkIndex);
        }
    }  
    
    //계정정지된 사람
    for(let i =0; i<checkList.length; i++){
        let report_id = "";
        report_id = report[i];
        reportArr[i] = report_id.split(" ");
        
        var v_person = reportArr[i][0]; //신고한 사람
        var b_person = reportArr[i][1]; //신고당한 사람
        
        let count = 0; //신고당한 횟수
        
        for(let j = 0; j<reportArr.length; j++){
            if(b_person === reportArr[j][1]){
                count++;
            }    
           
            if(count >= k){
                stopUser.push(b_person);
            }
        }
    }
    
    //정지된 사람을 신고한 사람.
    for(idx=0; idx<reportArr.length; idx++){      
        if(stopUser.length != 0){
            for(idx2 = 0; idx2<stopUser.length; idx2++){
                if(stopUser[idx2] === reportArr[idx][1]){
                    mailList[idx] = reportArr[idx][0];
                }
            }
        }
    }
    
    //신고한 사람에게 메일
    for(i = 0; i<id_list.length; i++){
        let checkId = "";
        let m_count = 0;
        
        checkId = id_list[i];
        
        if(mailList.length != 0){
            for(j = 0; j<mailList.length; j++){
                if(checkId === mailList[j]){
                    m_count++;
                    answer[i] = m_count;
                }else{
                    answer[i] = m_count;
                }
            }
        }else{
           answer[i] = 0;
        } 
       
    }
    
    return answer;
}

피드백

이 문제는 Hash 자료구조(set, map)를 사용해서 코드를 작성할 수 있는지를 보는 문제입니다. 메서드와 자료구조에 대한 지식이 없어 for과 if만으로 구성된 복잡하고 비효율적인 코드를 짜게 되었습니다. 테스트 케이스를 통과하긴 했어도 정확성은 20퍼센트를 넘기지 못했고 가독성도 떨어지는 코드를 작성했습니다.

1. Set 객체의 사용

  • Set 객체는 ES6에서 등장한 새로운 데이터 object로 Set 객체에서는 unique한 값만 저장 할 수 있기 때문에 Set을 사용하면 데이터를 중복을 쉽게 제거할 수 있습니다.
const set_list = new Set(report); //set object
const unique_report = [...set_list] // spread operator

2. Map의 사용

Map은 key값으로 value를 얻을 수 있는 편리한 자료구조 중 하나입니다.

let reported_list = new Map();
let stop_list = {};

unique_report.forEach(eachData => {
        let reporter = eachData.split(' ')[0];
        let victim = eachData.split(' ')[1];

        if(reported_list.get(victim)!=null){
            let val = reported_list.get(victim) + " " + reporter;
            reported_list.set(victim,val);
            stop_list[victim]++;
        }else{
            reported_list.set(victim,reporter);
            stop_list[victim]++;
        }

        if(stop_list[victim] >= k){
            let reportedList = reported_list.get(victim).split(" ");
            for(let i in reportedList){
                let index = id_list.indexOf(reportedList[i]);
                answer[index]++;
            }
        }

    });
    
    return answer;    

느낀점

문제가 요구하는 것이 무엇인지 파악하지 않고 코드를 작성하다보니 작성 시간은 길어졌고 비효율적이고 가독성이 떨어지는 코드를 작성하게 되었습니다. 또 메서드와 객체, 자료구조의 대한 기본적인 이해가 필요하다고 느꼈습니다.
스터디 1회차지만 많은 것을 얻어갔습니다. 제 공부방법을 반성하게 되었고 다른 사람들이 어떤 식으로 공부하는지 알 수 있었던 기회가 되었습니다.

profile
웹개발

0개의 댓글