링크
https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제




풀이
1. 아이디 리스트 정렬
2. 신고 내역 중복 제거
3. 신고 내역 취합
4. 받은 메일 결과 반환
총 4단계로 분류해서 풀었습니다.
String[] id_list: 유저 ID
String[] report: {유저 ID / 유저가 신고한 ID}
int k: 정지 기준 신고 횟수
1. 아이디 리스트 정렬
id_list 순서대로 메일 받은 수를 반환하기 때문에 해당 순서를 저장합니다.
setId 함수를 만들어서 따로 정렬했습니다.
public int[] solution(String[] id_list, String[] report, int k) {
// 1. 아이디 리스트 정렬
HashMap<String, String> map = setId(id_list);
}
public HashMap<String, String> setId(String[] id_list) {
HashMap<String, String> map = new HashMap<>();
for (int i = 0; i < id_list.length; i++) {
map.put(i+"", id_list[i]);
map.put(id_list[i], i+"");
}
return map;
}
2. 신고 내역 중복 제거
중복된 신고는 제거해줍니다. (동일한 아이디가 동일한 신고를 했을 시)
스트림을 사용하여 제거 했습니다.
public int[] solution(String[] id_list, String[] report, int k) {
// 1. 아이디 리스트 정렬
HashMap<String, String> map = setId(id_list);
// 2. 신고 내역 중복 제거
String[] list = Arrays.stream(report).distinct().toArray(String[]::new);
}
3. 신고 내역 취합
중복된 신고가 제거되었으니 신고 목록에 있는 내용을 취합합니다.
getReportCounts 함수로 기능을 구현했습니다.
public int[] solution(String[] id_list, String[] report, int k) {
// 1. 아이디 리스트 정렬
HashMap<String, String> map = setId(id_list);
// 2. 신고 내역 중복 제거
String[] list = Arrays.stream(report).distinct().toArray(String[]::new);
// 3. 신고 내역 취합
int[] reportCounts = getReportCounts(map, list, id_list.length);
}
public int[] getReportCounts(HashMap<String, String> map, String[] list, int cnt) {
int[] result = new int[cnt];
for (String reporter : list) {
int index = Integer.parseInt(map.get((reporter).split(" ")[1]));
result[index] += 1;
}
return result;
}
4. 받은 메일 결과 반환
신고 내역을 취합한 기준으로 정지 기준 횟수가 해당되는 경우 메일 발송 대상자로 체크합니다.
그리고 각 유저가 몇 번의 메일을 받았는지 최종 결과로 반환해줍니다.
getMailCounts 함수로 기능을 구현했습니다.
public int[] solution(String[] id_list, String[] report, int k) {
// 1. 아이디 리스트 정렬
HashMap<String, String> map = setId(id_list);
// 2. 신고 내역 중복 제거
String[] list = Arrays.stream(report).distinct().toArray(String[]::new);
// 3. 신고 내역 취합
int[] reportCounts = getReportCounts(map, list, id_list.length);
// 4. 받은 메일 결과 반환
return getMailCounts(map, list, reportCounts, k);
}
public int[] getMailCounts(HashMap<String, String> map, String[] list, int[] reportCounts, int k) {
int[] result = new int[reportCounts.length];
for (String reporter : list) {
int index = Integer.parseInt(map.get((reporter).split(" ")[1]));
if (reportCounts[index] < k) continue;
int answerIndex = Integer.parseInt(map.get((reporter).split(" ")[0]));
result[answerIndex] += 1;
}
return result;
}
전체코드
public HashMap<String, String> setId(String[] id_list) {
HashMap<String, String> map = new HashMap<>();
for (int i = 0; i < id_list.length; i++) {
map.put(i+"", id_list[i]);
map.put(id_list[i], i+"");
}
return map;
}
public int[] getReportCounts(HashMap<String, String> map, String[] list, int cnt) {
int[] result = new int[cnt];
for (String reporter : list) {
int index = Integer.parseInt(map.get((reporter).split(" ")[1]));
result[index] += 1;
}
return result;
}
public int[] getMailCounts(HashMap<String, String> map, String[] list, int[] reportCounts, int k) {
int[] result = new int[reportCounts.length];
for (String reporter : list) {
int index = Integer.parseInt(map.get((reporter).split(" ")[1]));
if (reportCounts[index] < k) continue;
int answerIndex = Integer.parseInt(map.get((reporter).split(" ")[0]));
result[answerIndex] += 1;
}
return result;
}
public int[] solution(String[] id_list, String[] report, int k) {
// 1. 아이디 리스트 정렬
HashMap<String, String> map = setId(id_list);
// 2. 신고 내역 중복 제거
String[] list = Arrays.stream(report).distinct().toArray(String[]::new);
// 3. 신고 내역 취합
int[] reportCounts = getReportCounts(map, list, id_list.length);
// 4. 받은 메일 결과 반환
return getMailCounts(map, list, reportCounts, k);
}

후기
* 난이도 (5점 만점)
5 : 풀 줄 알면 기업 코딩 테스트는 문제없음.
4 : 평균적인 기업 코딩 테스트의 중간 이상.
3 : 평균적인 기업 코딩테스트의 쉬운 문제.
2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.
1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.
[카카오 코딩 테스트 2022 신입 공채] 신고 결과 받기는 평균적인 기업 코딩테스트 문제로 보입니다.
난이도나 문제 유형이 코딩테스트를 볼 때 출제되는 문제와 흡사했습니다.
한 번 씩 풀어보시길 바랍니다.
'카카오코딩테스트 풀이 > 2022' 카테고리의 다른 글
[카카오 코딩 테스트 2022 신입 공채] 주차 요금 계산 (0) | 2022.10.12 |
---|---|
[카카오 코딩 테스트 2022 신입 공채] k 진수에서 소수의 개수 구하기 (0) | 2022.04.03 |