문제: https://school.programmers.co.kr/learn/courses/30/lessons/92334
(풀이방식 1)
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
Map<String, Integer> answerScore = new HashMap<>();
// 1. 중복 없애기
List<String> reports = new ArrayList<>();
for(String reportElement : report ){
if(!reports.contains(reportElement)){
reports.add(reportElement);
}
}
// 2. list를 하나씩 꺼내서 map에 넣기
Map<String, Integer> score = new HashMap<>();
for(String str : reports){
String name = str.split(" ")[1];
score.put(name, score.getOrDefault(name, 0) + 1);
}
// 3. reports 돌며 이름 확인해서 더하기
for(String str : reports){
String name1 = str.split(" ")[0]; // 신고 한사람
String name2 = str.split(" ")[1]; // 신고 당한사람
if(score.get(name2) != null &&
score.get(name2) >= k){
answerScore.put(name1, answerScore.getOrDefault(name1, 0) + 1);
}
}
for(int i = 0; i < id_list.length; i++){
if(answerScore.get(id_list[i]) != null ){
answer[i] = answerScore.get(id_list[i]);
}
}
return answer;
}
}
→ 중복을 제거하는 부분에서 ArrayList를 사용했더니 시간초과 발생
contains는 순차적으로 찾기 때문에 O(n)의 복잡도 발생 → 최악의 경우 O()
report 길이 = → 2중반복 불가
(풀이방식2) Set 활용
import java.util.*;
public class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
Map<String, Integer> answerScore = new HashMap<>();
Set<String> reports = new HashSet<>();
// 1. 중복제거
for(String str : report){
reports.add(str);
}
// 2. 신고당한 횟수 저장
Map<String, Integer> score = new HashMap<>();
for(String str : reports){
String[] parts = str.split(" ");
String name = parts[1];
score.put(name, score.getOrDefault(name, 0) + 1);
}
// 3. 메일 수신 횟수 저장
for(String str : reports){
String[] parts = str.split(" ");
String name1 = parts[0]; // 신고 한 사람
String name2 = parts[1]; // 신고 당한 사람
if (score.getOrDefault(name2, 0) >= k) {
answerScore.put(name1, answerScore.getOrDefault(name1, 0) + 1);
}
}
// 4. answer 완성
for (int i = 0; i < id_list.length; i++) {
answer[i] = answerScore.getOrDefault(id_list[i], 0);
}
return answer;
}
}