Algorithm/Programmers

[Programmers] 신고 결과 받기

Jyuni 2024. 1. 30. 14:29

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

 

프로그래머스

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

programmers.co.kr

문제 풀이

id_list : 이용자의 Id, report : 신고 정보, k : 정지 기준이 주어졌을 때, 신고 성공 메일을 받은 횟수 return

 

이용자들을 Map<String, Integer>을 사용하여 각각 index를 붙여준다. 

report정보를 2차원 배열에 저장한다. 신고 여부만 확인하면 되기 때문에 boolean[][]을 사용했다.

예제 1번을 예시로 들면

  muzi frodo apeach neo
muzi false true false true
frodo false false false true
apeach true true false false
neo false false false false

이런 형태로 신고 상황을 정리할 수 있다.

여기서 가로는 신고한 내역, 세로는 신고 당한 내역이 된다.

 

정지가 된 아이디를 구할려면 세로를 먼저 확인 후 k이상이면 1차원 배열에 해당 인덱스를 true로 저장한다.

이후에 가로로 돌면서 신고 여부와 정지된 아이디를 체크하여 신고 성공 메일을 받은 횟수를 구할 수 있다.

코드

import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        Map<String, Integer> idMap = new HashMap<>();
        int len = id_list.length;
        int[] answer = new int[len];
        boolean[][] reportArr = new boolean[len][len];
        boolean[] reportId = new boolean[len];

        // init
        for(int i=0; i<len; i++) {
            idMap.put(id_list[i], i);
        }

        for(String id : report) {
            StringTokenizer st = new StringTokenizer(id);
            int reporter = idMap.get(st.nextToken());
            int reported = idMap.get(st.nextToken());
            reportArr[reporter][reported] = true;
        }

        // 정지 아이디
        for(int i=0; i<len; i++) {
            int reportCnt = 0;
            for(int j=0; j<len; j++) {
                if(reportArr[j][i]) {
                    reportCnt++;
                }
            }

            if(reportCnt >= k) reportId[i] = true;
        }

        // 신고 성공
        for(int i=0; i<len; i++) {
            int cnt = 0;
            for(int j=0; j<len; j++) {
                if(reportArr[i][j] && reportId[j]) {
                    cnt++;
                }
            }

            answer[i] = cnt;
        }

        return answer;
    }
}