프로그래머스 신고 결과 받기 [Java]
문제 출처
https://programmers.co.kr/learn/courses/30/lessons/92334
2022 KAKAO BLIND RECRUITMENT 문제고 프로그래머스에서는 level 1문제이다.
내가 생각한 접근 방법
-신고 당한 id들의 신고 당한 횟수를 카운트해야 한다.
-정지 당한 id를 신고한 id들을 저장해야한다.
가장 시간이 오래 걸렸던게 report의 중복처리였다. String을 어떻게든 카운트해서 중복을 없애는 시도를 하다가 결국 검색을 하게 됐고 간단한 방법을 찾게됐다.
공부한 글 링크:
https://lastday9.tistory.com/90
내가 제출한 코드는 아래와 같은데 여러모로 비효율적이라 고쳐야할 점들이 많이 보인다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
report = Arrays.stream(report).distinct().toArray(String[]::new);
HashMap<String, Integer> count = new HashMap<>();
HashMap<String, ArrayList<String>> idMap = new HashMap<>();
for(String s : report){
String[] r = s.split(" ");
if(count.containsKey(r[1])){
count.put(r[1], count.get(r[1]) + 1);
}
else{
count.put(r[1], 1);
}
ArrayList<String> tmp = new ArrayList<>();
if(idMap.containsKey(r[1])){
tmp = idMap.get(r[1]);
tmp.add(r[0]);
idMap.put(r[1], tmp);
}
else{
tmp.add(r[0]);
idMap.put(r[1], tmp);
}
}
HashMap<String, Integer> mailMap = new HashMap<String, Integer>();
for(Map.Entry<String, Integer> c : count.entrySet()){
if(c.getValue() >= k){
for(String s : idMap.get(c.getKey())){
if(mailMap.containsKey(s)){
mailMap.put(s, mailMap.get(s) + 1);
}
else{
mailMap.put(s, 1);
}
}
}
}
int[] answer = new int[id_list.length];
for(int i = 0; i < id_list.length; i++){
if(mailMap.containsKey(id_list[i])){
answer[i] = mailMap.get(id_list[i]);
}
else{
answer[i] = 0;
}
}
return answer;
}
}
-count 해쉬맵에는 <신고당한id, 신고당한횟수>가 들어가게 된다.
-idMap 해쉬맵에는 <신고당한id, 신고한사람id>가 들어가게 된다.
for문 안에서 report를 위의 해쉬맵에 저장한다.
-mailMap 해쉬맵에는 <id, 메일을 받을 횟수>가 들어가게된다.
*고치고 싶은 부분 중 하나 메일 받을 횟수를 굳이 해쉬맵을 이용해서 만들게 된 이유는 이전 count와 idMap이 무작위로 순서가 나오기 때문에 바로 answer배열에 집어넣을 수 없어 이런 수고로움을 거쳤는데 더 좋은 방법이 있을 것 같다.
-answer 부분 id_list를 이용해서 반복문을 돌려 mailMap에서 id를 순서대로 찾아 정지 메일을 받을 개수를 answer에 저장한다.
'문제풀이 > 코딩테스트' 카테고리의 다른 글
프로그래머스 숫자 문자열과 영단어 [Java] (0) | 2022.02.14 |
---|---|
프로그래머스 신규 아이디 추천 [Java] (0) | 2022.02.13 |
백준 1157번 : 단어 공부 (0) | 2021.05.29 |
백준 1932번 : 정수 삼각형 (0) | 2021.05.28 |
백준 1654번 : 랜선 자르기 [C언어] (0) | 2021.05.28 |