-
[프로그래머스 / JAVA] 신고 결과 받기 (정답 풀이)코딩/코테준비(JAVA) 2025. 2. 19. 21:16
막히거나 틀린 부분이 있더라도, 그냥 그대로 내가 스스로 작성한 부분들을 기록하고 있다.
미래의 복기용으로 나를 위해 적어둔 기록이다.
(이 사람은 어떻게 실패하거나 성공했는지 살펴보는 용도로도 적합할 것 같다.)
최근에 내가 풀어서 맞춘 문제 중에 가장 오래 풀었다고 생각한다.
2트만에 성공했다.
이번에 특히 크게 느꼈던 점은 아래와 같다.
"복잡한 문제는 먼저 어떤 방법으로 풀어 나갈 것인지에 대한 설계를 종이 같은데에 간단히 메모를 해 놓자."
처음에는 그냥 코드부터 짜기 시작했었는데, 도저히 머리속에서 정리가 되지 않아 계속 멈추게 되었다.
두 번째는 아래와 같이 먼저 노트에 메모를 해놓고 시작했다.그랬더니 내 진행상황에 대한 감도 잡히고 훨씬 수월하게 문제를 풀 수 있었다.
import java.util.HashMap; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Arrays; class Solution { public int[] solution(String[] id_list, String[] report, int k) { // {신고자, 신고한사람들(중복제거)} HashMap<String, HashSet<String>> reportLogMap = new HashMap<>(); for (String line: report) { String[] fromAndTo = line.split(" "); String from = fromAndTo[0]; String to = fromAndTo[1]; if (!reportLogMap.containsKey(from)) { reportLogMap.put(from, new HashSet<>()); } reportLogMap.get(from).add(to); } // System.out.println(reportLogMap.toString()); // {muzi=[neo, frodo], frodo=[neo], apeach=[muzi, frodo]} // 각 유저가 신고 당한 횟수 저장(각각 다른 유저로부터) HashMap<String, Integer> reportCntMap = new HashMap<>(); reportLogMap.entrySet().forEach(entry -> { // 각 유저로부터 신고당한 사람의 Set HashSet<String> reportedSet = entry.getValue(); for (String reportedPerson: reportedSet) { if (!reportCntMap.containsKey(reportedPerson)) { reportCntMap.put(reportedPerson, 0); } reportCntMap.put(reportedPerson, reportCntMap.get(reportedPerson) + 1); } }); // System.out.println(reportCntMap.toString()); // {muzi=1, neo=2, frodo=2} muzi는 총 1번, neo는 2번, frodo는 2번 신고당함 ArrayList<String> banList = new ArrayList<>(); reportCntMap.forEach((key, value) -> { if (value >= k) { banList.add(key); } }); // System.out.println(banList); // [neo, frodo] List<String> id_List = Arrays.asList(id_list); int[] answer = new int[id_list.length]; // 자바에서는 람다 표현식 내부에서 외부 변수를 참조할 때 그 변수가 final이거나 "effectively final"(사실상 final)이어야 합니다. // 참조형은 내부에서 값을 변경 가능. -> int 대신 길이 1짜리 int[]를 만들어서 사용하는 꼼수 reportLogMap.forEach((key, value) -> { //각 유저가 메일 몇통 받아야 하는지 세기 String reporter = key; // 신고자 int idx = id_List.indexOf(key); HashSet<String> reportLists = value; // 각 유저가 신고했던 사람들 목록 reportLists.forEach(reported -> { if (banList.contains(reported)) { answer[idx]++; } }); }); return answer; } }
아직 자바에 대해 많이 익숙지 않아서, forEach문에 람다 표현식 사용하는 방법으로 주로 접근했다.
코딩테스트 책에서 위 방식대로 많이 접근해서, 그 책을 본 나도 저 방법이 현재로서는 제일 익숙하다.
따로 글로 해설을 남기기에는 시간이 너무 많이 걸릴 것 같아, 주석과 노트로 대신하겠다.
하루에 한 문제 이상 꾸준히 풀자.
실수는 많이 할수록, 더 많이 배울 수 있다.
https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
'코딩 > 코테준비(JAVA)' 카테고리의 다른 글
[프로그래머스 / JAVA] 기지국 설치 (정답 코드) (0) 2025.03.26 [프로그래머스 / JAVA] 카드 뭉치 (정답 풀이) (0) 2025.02.12 [프로그래머스 / JAVA] 기능개발 (정답풀이) (0) 2025.02.12 [프로그래머스 / JAVA] 크레인 인형뽑기 게임 (정답 풀이) (0) 2025.02.06 [프로그래머스 / JAVA] 주식 가격 (정답 풀이) (1) 2025.02.02