본문 바로가기
알고리즘

[프로그래머스/JAVA] 신고 결과 받기

by 상후 2022. 5. 29.
728x90
반응형

 

 

https://github.com/ROUTINE-STUDY/Algorithm

알고리즘 스터디를 진행하고 있습니다. 😊
초보들로 구성되어있으며, 열심히 풀어보고 풀이 방식을 공유하고 피드백을 해주는 스터디입니다.
참여 문의는 댓글 혹은 GitHub 주소를 참고해주세요.

문제 출처 :  https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

풀이 방법
- 자신이 신고한 목록(Set)과 자신이 신고당한 횟수를 상태로 가지는 클래스 설계
- 자신이 신고한 목록을 ArrayList가 아닌 Set을 쓴 이유는 중복 신고를 컨트롤하기 위함
- 결과를 위해 순서를 보장하는 LinkedHashMap을 사용(Key 값은 userId로 활용)

 

내 코드(JAVA)

 

class User {
    private final Set<String> reports = new HashSet<>();
    private int reportCount;

    public boolean addReportUser(String userId) { // 신고 목록 저장
        return reports.add(userId);
    }

    public Set<String> getReports() { // 내 신고 목록 가져오기
        return reports;
    }

    public void increaseReportCount() { // 신고 당한 횟수 증가
        reportCount++;
    }

    public int getReportCount() { // 내 신고 당한 횟수 가져오기
        return reportCount;
    }

}

public class Sanghoo {
    public static int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        Map<String, User> userList = new LinkedHashMap<>(); // 순서를 보장하는 LinkedHashMap 사용

        // 1. 유저 생성
        for (String id : id_list) {
            userList.put(id, new User());
        }

        // 2. 유저의 신고목록을 저장 및 신고대상 횟수 증가
        for (String reportStr : report) {
            String[] reportArr = reportStr.split(" ");
            String userId = reportArr[0];
            String target = reportArr[1];

            if(userList.get(userId).addReportUser(target)) { // 중복신고는 불가능
                userList.get(target).increaseReportCount();
            }
        }

        int i = 0;
        for (String key : userList.keySet()) {
            int mailCount = 0;
            User user = userList.get(key);

            if (!user.getReports().isEmpty()) {
                for (String target : user.getReports()) {
                    if (userList.get(target).getReportCount() >= k) { // 3. 유저가 신고한 대상이 k번 이상 신고되었으면 메일 받음
                        mailCount++;
                    }
                }
            }

            answer[i++] = mailCount;
        }

        return answer;
    }
}

 

다른 사람 코드

 

- 스트림을 활용하여 간결한 코드들이 눈에 띄었다. 
스트림, 람다 등을 좀 더 연습해볼 필요가 있겠다.

 

 

 

 

728x90
반응형

댓글