-
[프로그래머스] 신고 결과 받기 자바. Set 활용 중복제거코딩테스트 2025. 4. 3. 12:24반응형
https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
신고 후 처리 결과를 전송해야 한다.
id_list : 전체 유저 목록이고, report는 "신고자 신고대상"의 집합이다.
k는 정지기준이며 처리결과로 신고대상이 정지된 수의 집합이다.
제한사항
* 한 번에 한 명의 유저 신고 가능. 횟수 제한 없음.
* 동일 유저에 대한 신고 횟수는 누적되도 1회로 간주.
* k번 이상 신고된 유저는 이용 정지. 유저 신고 내용을 모두 취합해 마지막에 한꺼번에 통보.접근
동일인이 동일대상을 신고하는데 제한이 없으므로 reported에 중복신고가 있을 수 있음. 처리 전 불필요한 중복작업을 제거하기 위해 String[] report 를 Set<String>으로 변환한 뒤 신고횟수를 카운팅할 Map 과 신고대상을 저장할 Map을 별도로 사용해 분류한 뒤 마지막으로 answer[]에 신고당한 횟수 >= k 하여 카운팅 한 결과값을 반환하는 코드를 작성했다.
public int[] solution(String[] id_list, String[] report, int k) { Map<String, Integer> countMap = new HashMap<>(); Map<String, Set<String>> reporterMap = new HashMap<>(); int[] answer = new int[id_list.length]; //신고한 아이디가 정지당하여 메일로 통보할 횟수 모음 //신고정보 초기화 for(String id : id_list){ countMap.put(id, 0); reporterMap.put(id, new HashSet<>()); } //중복 제거가 필요함. Set? Set<String> reportSet = new HashSet<>(Arrays.asList(report)); for(String r : reportSet){ String[] ar = r.split(" "); //신고횟수 카운트 countMap.put(ar[1], countMap.get(ar[1]) +1); //신고대상 저장 reporterMap.get(ar[0]).add(ar[1]); } //정지대상 선별 for(int i = 0; i < id_list.length; i++){ String user = id_list[i]; Set<String> reportedUsers = reporterMap.get(user); int mailCnt = 0; for(String reported : reportedUsers){ if(countMap.get(reported) >= k) { mailCnt ++; } } answer[i] = mailCnt; } return answer; }
알게 된 점
1. 배열을 Set으로 변환 : Set<T> set = new HashSet<>(Arrays.asList(배열));
2. Set에 추가 : set.add() -> 결과값을 boolean 반환. if문에 활용 가능.반응형'코딩테스트' 카테고리의 다른 글
[프로그래머스] 최소 직사각형 자바 Math.max Math.min (0) 2025.04.03 [프로그래머스] 나머지가 1이 되는 수 찾기 자바 제곱근 활용 (0) 2025.04.03 [프로그래머스] 성격 유형 검사하기 (0) 2025.04.03 [프로그래머스] 숫자 짝꿍 (0) 2025.04.02 [프로그래머스] 삼총사 자바 (0) 2025.04.02