공부해 codingTest

프로그래머스 JAVA Level 1. 신고 결과 받기

러쉬허쉬 2022. 12. 13. 05:24

Level 1. 신고 결과 받기

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

 

프로그래머스

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

programmers.co.kr

 

import java.util.*;
class Solution {
    public List<Integer> solution(String[] id_list, String[] report, int k) {
        List<Integer> answer = new ArrayList<>();

 

        //중복 신고를 제외한 신고자와 용의자를 HashMap구조로 만듦. realReport<신고자, 용의자>. 용의자는 ":"으로 구분.

        //중복 신고를 제외한 용의자와 신고받은 횟수를 HashMap구조로 만듦. reported<용의자, 신고받은 횟수>.
        HashMap<String, String> realReport = new HashMap<>();
        HashMap<String, Integer> reported = new HashMap<>();
        HashSet<String> hs = new HashSet<>();
        StringTokenizer st;
        String reporter;
        String suspect;
        for(String r : report) {
        if(hs.add(r)) {
            st = new StringTokenizer(r);
            reporter = st.nextToken();
            suspect = st.nextToken();

            if(realReport.get(reporter) == null) {
                realReport.put(reporter, suspect + ":");
            } else {
                realReport.put(reporter, realReport.get(reporter) + suspect + ":");
            }

            if(reported.get(suspect) == null) {
                reported.put(suspect, 1);
            } else {
                reported.put(suspect, reported.get(suspect)+1);
            }
        }
    }

 

    //신고 결과를 받을 사용자와 횟수. 순서가 있는 LinkedHashMap구조로 만듦. mail<사용자, 신고 결과 횟수>.
    LinkedHashMap<String, Integer> mail = new LinkedHashMap<>();
    for(String id : id_list) {
        mail.put(id, 0);
    }

 

 

    //신고 받은 횟수가 k회 이상인 용의자를 신고한 사용자들에게 신고 결과 횟수를 +1
    for(String key : reported.keySet()) {
        if(reported.get(key) >= k) {
            for(String key2 : realReport.keySet()) {
                st = new StringTokenizer(realReport.get(key2), ":");

                while(st.hasMoreTokens()) {
                    if(st.nextToken().equals(key)) {
                        mail.put(key2, mail.get(key2)+1);
                    }
                }
            }
        }
    }

 

    //신고 결과 횟수를 List구조인 answer에 추가해서 반환한다.
    for(String key : mail.keySet()) {
        answer.add(mail.get(key));
    }
        
        return answer;
    }
}

 

 

1) 첫번째 고민 : 신고 결과 횟수를 주어진 id_list 순서에 맞게 반환.

-해결 : 순서가 있는 LinkedHashMap구조를 사용했다.

 

2) 두번째 고민 : 테스트3, 테스트21 시간초과.

-해결 : 중복 신고를 제외하고, 용의자와 신고받은 횟수를 구하는 반복문과

            중복 신고를 제외하고, 각각의 신고자가 신고한 용의자들을 구하는 반복문을 통합했다.

 

3) 전체적인 흐름 :

-한 사람이 같은 사람을 여러번 신고하는 중복 신고를 제외 하는 방법 생각한다.

-중복 신고를 제외하고 용의자들이 신고 받은 횟수를 저장할 방법을 생각한다.

-중복 신고를 제외하고 용의자들이 신고 받은 횟수가 k회 이상일 경우

 해당 용의자들을 신고한 사용자들이 누구인지 구분하는 방법을 생각한다.

-위에서 구분한 사용자들에게 신고 결과를 메일로 보낼 때, 주어진 id_list 순서에 맞게 반환할 방법을 생각한다.