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

반응형

프로그래머스 programmers Level1 신고 결과 받 - java 자바

[문제]

2022 KAKAO BLIND RECRUITMENT

https://school.programmers.co.kr/learn/courses/30/lessons/92334

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[풀이]

  •  id_list  : 이용자의 ID가 담긴 문자열 배열
  •  report  : 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열, "이용자ID 신고ID" (공백구분)
  •  k  : 정지 기준이 되는 신고 횟수
  •  return  : 각 유저별로 처리 결과 메일을 받은 횟수의 배열 

각 유저별로 신고한 이용자의 ID, 신고 받은 횟수를 가지고 있어야 한다. 따라서 신고한 이용자 ID 리스트, 신고받은 횟수 등을 담은 별도의 객체를 만들어 value로 하고, 이용자ID를 key로 하는 Map을 만들어 해결했다.

Map<이용자ID, 이용자ID의 상세 정보 객체> userMap = new HashMap<>(); 

  • 이용자의 상세 정보 객체는 아래의 정보를 담는다. 
    • 신고한 ID 리스트
    • 신고 받은 횟수
    • 신고 받은 횟수에 의한 정지여부

이용자ID에 대한 상세정보를 담을 객체를 코드로 작성하면 다음과 같다.

key : 이용자 ID (String) , value : 이용자 ID의 상세 정보 객체 (ReportDetail)

/**
 * 유저의 상세 정보를 담을 클래스
 */
class ReportDetail {

    /** 신고한 ID 리스트 */
    List<String> reportIds;

    /** 신고 받은 횟수 */
    Integer reportedCount;

    /** 이용정지 여부 : 정지가 아니면 false, 정지이면 true */
    Boolean block;

    /** 정지 기준 */
    Integer k;
    
    // 생성자
    public ReportDetail(List<String> reportIds, Integer reportedCount, Integer k) {
        this.reportIds = reportIds;
        this.reportedCount = reportedCount;
        this.block = Boolean.FALSE;
        this.k = k;
    }

    // getter
    public List<String> getReportIds() {
        return reportIds;
    }

    public Integer getReportedCount() {
        return reportedCount;
    }

    /** 신고한 ID 추가 */
    public void addReportId(String reportId) {
        // 신고하면 신고한 ID를 추가한다.
        reportIds.add(reportId);
    }

    /** 신고 받았을때 횟수 추가 */
    public void countReport() {
        reportedCount++; // 신고횟수 +1
        if (this.reportedCount >= k) {
            // 신고횟수가 정지횟수 이상이면 이용정지된다.
            block = Boolean.TRUE;
        }
    }
}

 

[java 코드]

/**
 * 신고 결과 받기
 * @param id_list 이용자의 ID 가 담긴 문자열 배열 (소문자)
 * @param report 각 이용자가 신고한 ID 의 정보가 담긴 문자열 배열 , "이용자ID 신고한ID" (공백구분)
 * @param k 정지 기준이 되는 신고 횟수
 * @return 각 유저별로 처리 결과 메일을 받은 횟수, id_list 배열 순서로 리턴
 * 한 유저를 여러번 신고할 수 있지만 신고 횟수는 1번으로 처리된다.
 * k 번 이상 신고된 유저는 게시판 이용이 정지되며 신고한 유저 전원에게 정지 사실을 메일로 발송한다.
 */
public int[] solution(String[] id_list, String[] report, int k) {
    int[] answer = {};
    // 전체 유저 생성
    Map<String, ReportDetail> usersMap = new HashMap<>();
    for (String id : id_list) {
        // key : 이용자 ID (String) , value : 이용자 ID의 상세 정보 객체 (ReportDetail)
        usersMap.put(id, new ReportDetail(new ArrayList<>(), 0, k));
    }
    // 중복 제거
    List<String> deduplicatedReport = Arrays.stream(report).distinct().collect(Collectors.toList());
    // 신고 확인
    for (String r : deduplicatedReport) {
        String[] reportDetail = r.split(" "); // 공백으로 잘라 0번 이용자, 1번 신고자
        // 이용자
        ReportDetail fromId = usersMap.get(reportDetail[0]);
        fromId.addReportId(reportDetail[1]);

        // 신고 받은사람 카운트 +1
        ReportDetail toId = usersMap.get(reportDetail[1]);
        toId.countReport();
    }
    answer = new int[id_list.length];
    // 신고 결과 체크
    for (int i = 0; i < id_list.length; i++) {
        // 사용자가 신고한 아이디들을 가져온다
        List<String> reportIds = usersMap.get(id_list[i]).getReportIds();
        // 신고한 아이디들을 확인하여 정지 대상이면 카운트한다
        for (String id : reportIds) {
            if (usersMap.get(id).block) {
                answer[i]++;
            }
        }
    }

    return answer;
}

/**
 * 신고 정보를 담을 클래스
 */
class ReportDetail {

    /** 신고한 ID 리스트 */
    List<String> reportIds;
    
    /** 신고받은 횟수 */
    Integer reportedCount;

    /** 정지 여부 : 정지가 아니면 false, 정지면 true */
    Boolean block;

    /** 정지 기준 */
    Integer k;

    public ReportDetail(List<String> reportIds, Integer reportedCount, Integer k) {
        this.reportIds = reportIds;
        this.reportedCount = reportedCount;
        this.block = Boolean.FALSE;
        this.k = k;
    }

    public List<String> getReportIds() {
        return reportIds;
    }

    public Integer getReportedCount() {
        return reportedCount;
    }

    public void addReportId(String reportId) {
        reportIds.add(reportId);
    }

    public void countReport() {
        reportedCount++;
        if (this.reportedCount >= k) {
            // 신고횟수가 정지횟수에 이상이면 정지
        block = Boolean.TRUE;
        }
    }
}
반응형