반응형
프로그래머스 2022 카카오 블라인드 코딩 테스트 문제이다.
레벨: 1
언어: JavaScript
문제 설명
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
- 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
- k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
- 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.
입력값
- id_list: 이용자의 id가 담긴 문자열 배열
- repoort: 각 이용자가 신고한 이용자의 ID가 담김 문자열 배열
- k: 정지 기준 신고 횟수 (포함)
출력 값
- 각 유저별 처리 결과 메일을 받은 횟수를 담은 배열 풀이과정
- 신고를 당한 유저의 신고 수, 신고한 유저의 id 알아야 한다.
- 신고당한 유저의 id를 key로 하고 신고한 유저의 id를 배열로 저장하는 객체를 만들어서 문제를 해결했다.
풀이 아이디어
- 신고 당한 유저의 신고횟수를 카운트하고 신고한 유저의 id를 저장한다.
- 신고 당한 유저의 신고횟수가 k를 넘으면 신고한 유저의 id를 세어서 정답 배열에 넣는다.
- 위의 정보를 저장하기 위해 객체를 사용하여 정보를 저장한다.
객체 예시 ( 문제 1번 k = 2)
key: 신고 당한 유저의 id
value: 신고를 한 유저의 id 배열
const report_list = {
muzi: [apeach]
frodo: [muzi, apeach] - 정지
apeach: []
neo: [frodo, muzi] - 정지
}
객체를 위와 같이 만들고 객체를 순회하면서 배열의 길이가 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;
}
코드 라인별 풀이
const answer = new Array(id_list.length);
answer.fill(0)
answer
배열을 id_list의 크기만큼 할당하고fill
함수를 사용하여 0으로 초기화한다.
id_list.map((user)=>{report_list[user] = []})
report_list
객체에 key는 uesr의 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)
}
})
report
의 값이["muzi frodo", ...]
와 같이 '신고한 id 신고당한 id' 형식의 띄어쓰기로 구분된 문자열을 split으로 자르고 각각user_id
와report_id
로 나눠주었다.
그리고 배열에 포함하는지 여부를 확인하여 포함하지 않을 때 신고자의 이름을 추가하였다.
for(const key in report_list){
if(report_list[key].length >= k){
report_list[key].map((user)=>{
answer[id_list.indexOf(user)] += 1
})
}
}
report_list
의 배열 길이가 k값 이상이면 정지된 유저이다.
answer에 해당 유저를 신고한 유저가 받은 메일을 수를 +1 하여준다.
더 좋은 방법이 있으시거나 고쳤으면 하는 부분이 있는 분은 언제든지 댓글 달아주세요 👍
반응형
'지난 글 모음' 카테고리의 다른 글
[프로그래머스] - LV1 모의고사 JavaScript (1) | 2022.01.22 |
---|---|
[프로그래머스] -LV1 로또의 최고 순위와 최저 순위 JavaScript (0) | 2022.01.22 |
스프링 핵심 원리 - 기본편 3 좋은 객체 지향 설계의 5가지 원칙(SOLID) (0) | 2021.05.14 |
스프링 핵심 원리 - 기본편 2 좋은 객체 지향 프로그램밍이란? (0) | 2021.05.12 |
스프링 핵심 원리 - 기본편 1 스프링이란? (0) | 2021.05.12 |