프로그래머스 JAVA Level 1. 신고 결과 받기
Level 1. 신고 결과 받기
https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
import java.util.*;
class Solution {
public List<Integer> solution(String[] id_list, String[] report, int k) {
List<Integer> answer = new ArrayList<>();
//중복 신고를 제외한 신고자와 용의자를 HashMap구조로 만듦. realReport<신고자, 용의자>. 용의자는 ":"으로 구분.
//중복 신고를 제외한 용의자와 신고받은 횟수를 HashMap구조로 만듦. reported<용의자, 신고받은 횟수>.
HashMap<String, String> realReport = new HashMap<>();
HashMap<String, Integer> reported = new HashMap<>();
HashSet<String> hs = new HashSet<>();
StringTokenizer st;
String reporter;
String suspect;
for(String r : report) {
if(hs.add(r)) {
st = new StringTokenizer(r);
reporter = st.nextToken();
suspect = st.nextToken();
if(realReport.get(reporter) == null) {
realReport.put(reporter, suspect + ":");
} else {
realReport.put(reporter, realReport.get(reporter) + suspect + ":");
}
if(reported.get(suspect) == null) {
reported.put(suspect, 1);
} else {
reported.put(suspect, reported.get(suspect)+1);
}
}
}
//신고 결과를 받을 사용자와 횟수. 순서가 있는 LinkedHashMap구조로 만듦. mail<사용자, 신고 결과 횟수>.
LinkedHashMap<String, Integer> mail = new LinkedHashMap<>();
for(String id : id_list) {
mail.put(id, 0);
}
//신고 받은 횟수가 k회 이상인 용의자를 신고한 사용자들에게 신고 결과 횟수를 +1
for(String key : reported.keySet()) {
if(reported.get(key) >= k) {
for(String key2 : realReport.keySet()) {
st = new StringTokenizer(realReport.get(key2), ":");
while(st.hasMoreTokens()) {
if(st.nextToken().equals(key)) {
mail.put(key2, mail.get(key2)+1);
}
}
}
}
}
//신고 결과 횟수를 List구조인 answer에 추가해서 반환한다.
for(String key : mail.keySet()) {
answer.add(mail.get(key));
}
return answer;
}
}
1) 첫번째 고민 : 신고 결과 횟수를 주어진 id_list 순서에 맞게 반환.
-해결 : 순서가 있는 LinkedHashMap구조를 사용했다.
2) 두번째 고민 : 테스트3, 테스트21 시간초과.
-해결 : 중복 신고를 제외하고, 용의자와 신고받은 횟수를 구하는 반복문과
중복 신고를 제외하고, 각각의 신고자가 신고한 용의자들을 구하는 반복문을 통합했다.
3) 전체적인 흐름 :
-한 사람이 같은 사람을 여러번 신고하는 중복 신고를 제외 하는 방법 생각한다.
-중복 신고를 제외하고 용의자들이 신고 받은 횟수를 저장할 방법을 생각한다.
-중복 신고를 제외하고 용의자들이 신고 받은 횟수가 k회 이상일 경우
해당 용의자들을 신고한 사용자들이 누구인지 구분하는 방법을 생각한다.
-위에서 구분한 사용자들에게 신고 결과를 메일로 보낼 때, 주어진 id_list 순서에 맞게 반환할 방법을 생각한다.