https://school.programmers.co.kr/learn/courses/30/lessons/92334
문제를 풀다 보면 문제 푸는데만 집중을 해서 정리할 틈도 없이 넘어가는 안 좋은 습관을 가지고 있어서 쓰게 됨
만약 나같은 사람이 있으면 한번 정리하면 좋을 듯 난 너무 늦게 깨달아서 슬픔;;
대충 신고한 사람이 신고 대상자가 정지를 먹으면 그 대상자의 개수를 반환 하라는 내용
나는 이렇게 풀었다.
아래 그림을 기준으로 1번에서 신고자 기준 신고 한 사람을 Set으로 세팅하고 신고 대상자는 자신이 몇 번 신고당했는지 count를 세팅
2번에서 신고한 사람이 누굴 신고했는지 Set에 추가해서 중복을 방지시킴 이유는 신고자는 같은 사람을 계속 신고 못함.
3번에서 각 신고한 사람 map 에서 신고한 사람의 list를 가져와 신고대상자 count Map(reportedMap)에 count를 증가시킴
마지막으로 신고대상자 count Map(reportedMap)을 순회하여 k번 이상 신고됐으면 +1을 하여 결과에 추가
이렇게 풀어도 정답이긴 한데 너무 쓸데없는 배열순회를 많이 한다. 다른 사람코드를 내 방식대로 고쳐봄
아래 그림을 기준으로 여기서는 1번 부터 신고한 사람이 같은 사람을 또 신고하는지 중복을 없애버렸다. 내 방식에서는 이 과정에서 map에 사람 기준으로 new Set으로 빈 Set을 등록하고 만들어진 Object에서 해당 신고자 set에 add로 중복을 걸러줬다. 아래 방식이 훨씬 간단하다.
2번에서는 중복이 걸러진 배열 reports 에서 신고 대상자의 count를 세서 map에 등록시켜줬다. 내 방식에서는 같은 신고 대상자의 count를 증가시키긴 하는데 나는 내 코드의 3번에 해당하는 신고 한 사람의 set리스트를 가져와서 신고 대상자의 count를 증가시키는 방식이다. 이러면 이중 for문이 되어서 성능이 느려진다. 이 결과가 나온 이유는 아래 코드는 처음부터 신고자와 신고 대상자의 중복을 줄여주는 방식으로 했고 나는 신고한 사람 기준으로 추가해 주는 방식으로 자료구조를 구상했기 때문이다.
그래서 결과를 반환할 때도 아래 코드는 신고한 사람이 신고 대상자가 정지가 됐는지 카운트를 세는 Object가 있어서 최종 결과로 for 한 번으로 답을 낼 수 있었지만. 나는 신고한 사람이 신고 대장자 set을 가지고 있었기 때문에 해당 set을 순회하여 대상자의 count를 확인해서 count를 세는 방식으로 결과를 내기 때문에 return 문에서도 성능이 안 좋아진다.
생각보다 시간이 많이 가네
결론은 자료구조 구상을 처음부터 잘해야 된다.