아래는 문제 링크입니다.
https://programmers.co.kr/learn/courses/30/lessons/92334
처음에 코딩을 하고 문제를 제출했는데 시간 초과..!!!! 채점해보니 66.7점이었다.
배열을 사용하고, 배열을 이용해서 중복을 검색하니까 아무래도 시간 초과가 발생한 것 같다.
개인적으로 이번 문제에서 정말 많은 부분을 다시 상기할 수 있었다.
생각한 부분은 다음과 같다.
1. 문제 해결을 위한 자료구조를 잘 결정하자.
이번 문제는 중복 처리를 잘 해주어야 했다. 중복을 막아주는 자료구조는 많다.
그런데 본인은 그런 부분의 고민을 접어두고 바로 배열을 이용해 중복을 검토하려고했다.
Set처럼 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는 좋은 자료구조가 있었는데도 불구하고.
이번 문제를 통해 다시금 이 부분을 상기시킬 수 있었던 것 같다. 삽질을 많이 했지만 많은 부분을 느낄 수 있었다.
2. 막히면 조금 다양한 시각에서 생각해보자.
사실 이 부분은 본인의 고질적인 문제라고 생각한다. 특히 학창시절 때도 이랬던 것 같다.
하나의 풀이를 정하면 그 풀이에서 잘 헤어나오지 못한다. 이번 문제에서도 크게 몇 가지 포인트가 있었다.
이번에 Map을 만들고 키 값을 신고한 사람으로 넣을 지, 신고 당한 사람으로 넣을 지 더 많은 부분을 생각하면 좋았을 것 같다.
또한 신고를 넣은 사람에게 어떻게 메일을 보내줄 지 조금 더 다양한 각도에서 보면 좋았을 것 같다.
예를 들어 정지 당한 사람만 신고를 넣은 사람 신고자 리스트에 남겨둔다던가,
아니면 이에 대해서는 불편하지만 반복문을 계속 사용할 것인지, if문은 어떤 조건으로 사용할 것인지..
이밖에도 또한 데이터는 어디서 가져올 것인지,
또한 id_list 순수 배열로 처리하기는 불편하니 이를 위한 보조 자료구조를 생성하다던가
다양한 시각으로 접근해보자.
3. 문제를 풀면 구글 검색을 통해 다양한 사람들의 풀이를 확인해보자.
이 부분이 2번에서 적은 내용에 조금 도움이 되지 않을까 싶다.
똑똑하고 멋진 분들이 해결책을 많이 올려주셔서 본인의 시야와 사고 방식에 큰 도움이 될 것 같다.
소스코드는 다음과 같다.
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
Map<String, HashSet<String>> map = new HashMap<>(); //해쉬 셋은 중복을 막는다.
Map<String, Integer> reportMap = new HashMap<>();
//초기화
for(int i = 0; i < id_list.length; i++){
map.put(id_list[i],new HashSet<>());
}
//신고를 넣은 사람이 key, 그 사람이 신고한 사람들 HashSet이 value
for(int i = 0; i < report.length; i++ ) {
String[] arr = report[i].split(" ");
String reportingPerson = arr[0];
String reportedPerson = arr[1];
if (map.get(reportingPerson).add(reportedPerson)) {
//HastSet을 사용해 중복이 불가, true면 처음 신고 당한 거
reportMap.put(reportedPerson, reportMap.getOrDefault(reportedPerson, 0) + 1);
}
}
for(int i = 0; i < report.length; i++){
String[] arr = report[i].split(" ");
String reportingPerson = arr[0];
String reportedPerson = arr[1];
if(reportMap.get(reportedPerson) < k){
map.get(reportingPerson).remove(reportedPerson);
}
}
for(int i = 0; i< id_list.length; i++){
answer[i] = map.get(id_list[i]).size();
}
return answer;
}
}
이상으로 포스팅을 마칩니다. 감사합니다.
댓글