본문 바로가기
PS/Programmers

[자바] 프로그래머스 - 신고 결과 받기 (programmers java)

by Nahwasa 2022. 5. 1.

문제 : programmers-신고결과받기

 

 

  프로그래머스 기준 레벨 1은 에바같고.. 레벨 2정도는 될 것 같다. 백준기준 한 실버5~3정도 수준인듯. 결국 서브 문제로 '잘' 나누고 적절한 자료구조를 '잘' 쓰면 된다. 사실 엄밀히 따지자면 기본적인 자료구조들을 다 알고있다는 가정하에 그냥 제시된대로 단순 구현만 하면 되는 문제니 레벨 1이 맞는것 같기도 하다.

 

  아무튼 내 경우엔 다음의 단계로 나누어서 풀었다.

1. 문자열을 숫자로 매칭 (안해도 되지만, 효율성을 높히려면 하면 좋다) - HashMap 사용

2. 신고당한 횟수를 센다 - int[] 사용 / 이 때 중복되는 신고는 걸러줘야 한다 - HashSet[] 사용 / 이 때 자신을 신고한 사람의 리스트를 유지한다 - ArrayList[] 사용

3. '2'에서 신고당한 횟수가 k 이상인 사람을 신고했던 사람들이 ArrayList[k] 리스트에 있으므로, 카운팅 해준다.

4. 결과 리턴

 

코드 : github

/**
 * 문제 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
 */
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.StringTokenizer;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int n = id_list.length;
        HashMap<String, Integer> idToNum = new HashMap<>();
        for (int i = 0; i < n; i++) idToNum.put(id_list[i], i);
        int[] reportCnt = new int[n];
        HashSet<Integer>[] chkDuplicatedReport = new HashSet[n];
        for (int i = 0; i < n; i++) chkDuplicatedReport[i] = new HashSet<>();
        ArrayList<Integer>[] reportNumList = new ArrayList[n];
        for (int i = 0; i < n; i++) reportNumList[i] = new ArrayList<>();
        for (int i = 0; i < report.length; i++) {
            StringTokenizer st = new StringTokenizer(report[i]);
            int from = idToNum.get(st.nextToken());
            int to = idToNum.get(st.nextToken());
            if (!chkDuplicatedReport[from].contains(to)) {
                chkDuplicatedReport[from].add(to);
                reportCnt[to]++;
                reportNumList[to].add(from);
            }
        }
        int[] answer = new int[n];
        for (int i = 0; i < n; i++) {
            if (reportCnt[i] < k) continue;
            for (int from : reportNumList[i]) {
                answer[from]++;
            }
        }

        return answer;
    }
}

댓글