[Java] 프로그래머스 Lv1_신고결과받기
Categories: Programmers
Tags: CodingTest, 실습
📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]
[Java] 프로그래머스 Lv1_신고결과받기
오늘의 문제는 현재 기준으로 정답률 39%이고, 카카오 2022년 블라인드 채용시 코딩테스트 문제이다
자료구조 Hash 문제 인 걸 선별해서 푸는 중인데 Lv1 이라서 좋아했다가, 정답률 보고 실망했다😀
-
HashMap 선언
1 2 3 4 5
//신고자 id > 신고 당한 사람 id Map<String, Set<String>> reports = new HashMap<>(); //신고당한사람, 신고당한 횟수- n번 Map<String, Integer> count = new HashMap<>();
- 신고한 사람과 신고 당한 사람을 reports(HashMap 변수)에 담고
- 신고당한 사람과 신고 횟수를 count(HashMap 변수) 에 담았다.
- 여기서 신고자는 신고를 여러 번 할 수는 있어도 한 사람을 여러 번 할 경우 한 번만 기록되기 때문에 Set 을 사용했다.
-
for 문 돌려서 Map에 담아주기~
1 2 3 4 5 6 7 8 9 10 11
for(int i = 0 ; i < report.length ; i++ ) { String[] arr = report[i].split(" "); Set<String> list = reports.getOrDefault(arr[0], new HashSet<>()); boolean b = list.add(arr[1]); reports.put(arr[0], list); if(b) { count.put(arr[1], count.getOrDefault(arr[1], 0) + 1); } }
- split으로 공백을 끊어서, 신고자(arr[0])와 피신고자(arr[1])를 배열에 담아준다.
- reports(HashMap 변수) 에는 안에 또 Set이 있기 때문에 key(신고자, arr[0])로 value를 조회하여 기존 Set을 꺼낸다, 만약 기존 신고 내역이 없으면 새로운 HashSet을 할당해준다.
- Set에 담을 때 아이디 중복 안돼서 한 개의 아이디만 들어가지만 , 무지가 프로도한테 여러번 신고 할 경우에 count(HashMap 변수) 에는 그 횟수만큼 들어가게 된다.
- 그래서 Set에 add에 성공하면 true, false를 반환하기 때문에 이를 활용해서 true일 때 count에 담도록 변경했다.
- 첫 번째 테스트 케이스는 통과했는데 두 번째에서 통과 안되면 여기 수정하면 통과한다~@!
-
결과 반환하기
1 2 3 4 5 6 7 8 9 10 11 12 13
//결과 담을 배열 int[] answer = new int[id_list.length]; for(int i = 0; i < id_list.length; i++) { //신고한 유저 중 정지된 id 구하기 - 신고한 사람들을 가져온 다음 신고 횟수가 k(정지 기준)이상이면 피신고자는 정지되었다 >> + 1 Set<String> list = reports.get(id_list[i]); if(list != null) { for(String s : list) { if(count.get(s) >= k) answer[i]++; } } }
- for(String s : list) 여기서 자꾸 NPE 발생해서 if(list != null) 조건식 추가해주었다
- 2번에서 reports.getOrDefault(arr[0], new HashSet<>()); 이렇게 할당해주었기 때문에 NULL이 발생할 리가 없을 거라고 생각했는데, 다시 생각해보니 신고한 적이 없는 회원은 당연히 NULL이 나올 수 밖에 없다… NPE 발생해서 한참 헤맸,,,,😥
-
그래서 아래와 같이 수정해주는 것이 좋음
1 2 3 4 5 6 7 8 9
for(int i = 0; i < id_list.length; i++) { //신고한 유저 중 정지된 id 구하기 - 신고한 사람들을 가져온 다음 신고 횟수가 k(정지 기준)이상이면 피신고자는 정지되었다 >> + 1 Set<String> list = reports.getOrDefault(id_list[i], new HashSet<>()); for(String s : list) { if(count.get(s) >= k) answer[i]++; } }
-
완성 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
import java.util.*; class Solution { public int[] solution(String[] id_list, String[] report, int k) { //신고자 id > 신고 당한 사람 id Map<String, Set<String> > reports = new HashMap<>(); //신고당한사람, 신고당한 횟수- n번 Map<String, Integer> count = new HashMap<>(); for(int i = 0 ; i < report.length ; i++ ) { String[] arr = report[i].split(" "); Set<String> list = reports.getOrDefault(arr[0], new HashSet<>()); boolean b = list.add(arr[1]); reports.put(arr[0], list); if(b) { count.put(arr[1], count.getOrDefault(arr[1], 0) + 1); } } //결과 담을 배열 int[] answer = new int[id_list.length]; for(int i = 0; i < id_list.length; i++) { //신고한 유저 중 정지된 id 구하기 - 신고한 사람들을 가져온 다음 신고 횟수가 k(정지 기준)이상이면 피신고자는 정지되었다 >> + 1 Set<String> list = reports.getOrDefault(id_list[i], new HashSet<>()); for(String s : list) { if(count.get(s) >= k) answer[i]++; } } return answer; } }
정답률 치고는 어렵지 않은 문제였지만 NPE 때문에 시간 잡아먹었던 문제였다..
예외처리는 미리미리하자🦾
Leave a comment