반응형
728x90
반응형
문제
https://programmers.co.kr/learn/courses/30/lessons/92334
풀이코드
import java.util.*;
import java.util.stream.Collectors;
/**
* @Date 2022/05/23
* @URL https://programmers.co.kr/learn/courses/30/lessons/92334
*/
public class P92334_신고_결과받기 {
public static void main(String[] args) {
// write your code here
P92334_신고_결과받기 main = new P92334_신고_결과받기();
System.out.println(Arrays.toString(main.solution(new String[]{"muzi", "frodo", "apeach", "neo"},
new String[]{"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"},
2)));
System.out.println(Arrays.toString(main.solution(new String[]{"con", "ryan"},
new String[]{"ryan con", "ryan con", "ryan con", "ryan con"},
3)));
}
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
Map<String, Integer> cntMap = new HashMap<>();
// 한 유저가 같은 유저를 여러 번 신고한 경우는 1번으로 처리해야한다.
// String[] report 를 중복을 없앤 List 객체로 변경하자.
/* Array to List */
List<String> reportList = Arrays
.stream(report)
.distinct() // 중복제거
.collect(Collectors.toList());
for (String value : reportList) {
String toName = value.split(" ")[1]; // 신고당한사람
// 신고당한사람(key)에 대한 신고당한횟수(value) 저장
// frodo 2, neo 2, muzi 1
if (cntMap.containsKey(toName)) {
cntMap.put(toName, cntMap.get(toName) + 1);
} else {
cntMap.put(toName, 1);
}
}
Map<String, Integer> indexMap = new HashMap<>();
for (int i = 0; i < id_list.length; i++) {
// muzi 0, frodo 1, apeach 2, neo 3
indexMap.put(id_list[i], i);
}
for (Iterator<String> iter = reportList.iterator(); iter.hasNext();) {
String s = iter.next();
String fromName = s.split(" ")[0]; // 신고자
String toName = s.split(" ")[1]; // 신고당한사람
if (cntMap.get(toName) >= k) { // 신고당한사람의 횟수가 k 이상일때
// indexMap.get(신고자명)의 value 가 index이고 그곳에 +1로 횟수를 저장한다.
answer[indexMap.get(fromName)] = answer[indexMap.get(fromName)] + 1;
}
iter.remove();
}
return answer;
}
}
1) report 배열을 List로 전환한다.
List<String> reportList = Arrays
.stream(report)
.distinct() // 중복제거
.collect(Collectors.toList());
2) reportList를 cntMap에 계산하여 데이터를 넣는다.
for (String value : reportList) {
String toName = value.split(" ")[1]; // 신고당한사람
// 신고당한사람(key)에 대한 신고당한횟수(value) 저장
// frodo 2, neo 2, muzi 1
if (cntMap.containsKey(toName)) {
cntMap.put(toName, cntMap.get(toName) + 1);
} else {
cntMap.put(toName, 1);
}
}
- key : 신고 당한 사람
- value : 신고 당한 횟수
3) indexMap에 신고자를 인덱스 0, 1, 2, 3 차례대로 넣는다.
Map<String, Integer> indexMap = new HashMap<>();
for (int i = 0; i < id_list.length; i++) {
// muzi 0, frodo 1, apeach 2, neo 3
indexMap.put(id_list[i], i);
}
4) 결과 객체인 answer 에 데이터를 넣는다.
for (Iterator<String> iter = reportList.iterator(); iter.hasNext();) {
String s = iter.next();
String fromName = s.split(" ")[0]; // 신고자
String toName = s.split(" ")[1]; // 신고당한사람
if (cntMap.get(toName) >= k) { // 신고당한사람의 횟수가 k 이상일때
// indexMap.get(신고자명)의 value 가 index이고 그곳에 +1로 횟수를 저장한다.
answer[indexMap.get(fromName)] = answer[indexMap.get(fromName)] + 1;
}
iter.remove();
}
반응형
'Algorithm > Problem Solving' 카테고리의 다른 글
[Baekjoon 17298번] 오큰수 문제 (with 자바) (0) | 2022.05.28 |
---|---|
[프로그래머스] Level3 43162번: 네트워크 (JAVA) (0) | 2022.05.24 |
[Baekjoon 2636번] 치즈 문제 (with 자바) (0) | 2022.05.04 |
[Baekjoon 11399번] ATM 문제 (with 자바) (0) | 2022.04.14 |
[Baekjoon 2559번] 수열 문제 (with 자바) - 투포인터 알고리즘 (0) | 2022.04.10 |