본문 바로가기

코딩테스트

프로그래머스 코딩테스트 - 신고 결과 받기 JavaScript

 

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

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

programmers.co.kr

 

이제 코딩테스트 문제를 풀어보려고

프로그래머스 코딩테스트 문제부터 차근차근 풀어보려고 한다

 

lv1문제부터 풀어보았는데 이 문제를 어찌풀어야하나

약간 멘붕왔음. 일단 제일 많이 쓰는 javascript로 풀어보았는데

내 부족함이 아~주 잘 보이더라. for문만 돌려쓰기 신공 ~ !

for문으로 떡칠된 내 풀이로 제출했더니 답은 다 맞는데 시간제한에서 걸려버렸다 ㅠㅠ

 

다른 사람들 해결코드 찾아보니 진짜 ..;; 신박함 ㄷㄷ

근데 내 생각이 다른 사람들의 생각과 일치하는 부분도 많아서

내심 뿌듯했다 ㅋㅋㅋㅋ 이럼 안돼 ..!!

 


LV 1 - 신고 결과 받기

2020 KAKAO BLIND RECRUITMENT

구글링해서 다른 분 풀이 참고한것 !!

const report_list = {
  muzi: [apeach]

  frodo: [muzi, apeach] - 정지

  apeach: []

  neo: [frodo, muzi] - 정지
}

 

일단 id_list 안의 각 아이디 / 그 아이디를 신고한사람의 배열 로 묶어

report_list를 만든다.

ex) 신고당한사람 : [신고한사람1, 신고한사람2 ...]

여기서 신고한사람의 배열길이가 k (정지 기준 신고 횟수) 이상이면 정지이다.

 

풀이코드

function solution(id_list, report, k) {
    const answer = new Array(id_list.length);
    answer.fill(0) 
    const report_list = {} //
    
    
    id_list.map((user)=>{
        report_list[user] = [] //key로 userid를 value로 빈 배열을 가지는 객체
    })
    
    report.map((user)=>{
        const [user_id, report_id] = user.split(' ')
        if(!report_list[report_id].includes(user_id)){
            report_list[report_id].push(user_id)
        }        
    })
    
    for(const key in report_list){
        if(report_list[key].length >= k){ //이용정지 유저
            report_list[key].map((user)=>{
                answer[id_list.indexOf(user)] += 1
            })
        }
    }
    return answer;
}

@wonyoung2 님 풀이참조 했습니다

 

코드 라인별 풀이

const answer = new Array(id_list.length);
answer.fill(0)

- 받아온 id_list의 길이로 배열을 만들어주고 fill 함수로 배열의 값을 0으로 채워준다.

 

 

id_list.map((user)=>{report_list[user] = []})

- map함수를 통해 key는 user_id의 값을, value는 신고한 사람을 담기위한 빈배열을 추가합니다.

 

 

report.map((user)=>{
  const [user_id, report_id] = user.split(' ')
  if(!report_list[report_id].includes(user_id)){
    report_list[report_id].push(user_id)
  }        
})

- map 함수를 이용한다. 신고자, 신고당한사람을 공백을 기준으로 split 함수로 잘라준다.

중복이 되면 안되기 때문에 신고당한 사람을 key로 그 객체에 현재요소의 user가 들어있는지 확인 한다.

들어 있지 않으면 신고당한사람(key) : [신고자] 로 넣어준다.  

 

 

for(const key in report_list){
  if(report_list[key].length >= k){
    report_list[key].map((user)=>{
      answer[id_list.indexOf(user)] += 1
    })
  }
}

- 이제 반복문을 이용하여 요소의 길이가 k 이상이면 id_list안의 user요소의 순서를 구해서

answer 순서의 요소를 +1시켜 준다.

 


후기는 진짜 온통 반복문으로만 해결하려 했던 내가 너무 부끄러웠고,

answer 배열의 길이를 id_list의 길이로 만들어주고 fill함수로 처음에 0으로 값을 세팅하는 부분..

그리고 마지막 answer배열 순서에 맞춰 값을 +1해주는 부분이 너무 신박하고 놀랬다 ..!!

아직 너무 부족하다 라는게 너무 나 많이 느껴졌던 ~ 앞으로 화이팅 해야지 ~ !!