본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 92334번: 신고 결과 받기 [Java]

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

 

프로그래머스

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

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        Map <String, Integer> id = new HashMap<>();
        for(int i = 0; i < id_list.length; i++)
            id.put(id_list[i], i);

        boolean[][] count = new boolean[id_list.length][id_list.length];
        for(String r : report) {
            String[] temp = r.split(" ");
            count[id.get(temp[0])][id.get(temp[1])] = true;
        }

        int[] answer = new int[id_list.length];
        for(int i = 0; i < count.length; i++) {
            int cnt = 0;
            int[] temp = answer.clone();
            for(int j = 0; j < count.length; j++) {
                if(count[j][i]) {
                    cnt++;
                    temp[j]++;
                }
            }
            if(cnt >= k)
                answer = temp.clone();
        }
        return answer;
    }
}

2. 설명

Map <String, Integer> id = new HashMap<>();
for(int i = 0; i < id_list.length; i++)
    id.put(id_list[i], i);

id_list의 내용과 그에 맞는 인덱스 값을 HashMap에 저장합니다.

boolean[][] count = new boolean[id_list.length][id_list.length];
for(String r : report) {
    String[] temp = r.split(" ");
    count[id.get(temp[0])][id.get(temp[1])] = true;
}

count는 id_list의 순서로 신고의 관계도를 나타냅니다. 행은 신고자이고 열은 신고를 받은 사람입니다. HashMap에 저장된 id_list의 값과 인덱스 값을 이용해서 빠르게 신고 관계도를 만듭니다.

int[] answer = new int[id_list.length];
for(int i = 0; i < count.length; i++) {
    int cnt = 0;
    int[] temp = answer.clone();
    for(int j = 0; j < count.length; j++) {
        if(count[j][i]) {
            cnt++;
            temp[j]++;
        }
    }
    if(cnt >= k)
        answer = temp.clone();
}

신고 관계도인 count를 통해서 열을 기준으로 즉, 신고당한 사람을 기준으로 총 신고받은 수를 확인한 뒤 만약 신고 횟수가 k 이상이어서 정지를 받게 된다면 해당 신고자에 해당하는 인덱스 값을 1씩 증가시켜 줍니다.

3. 정리

  1. HashMap을 이용하여 신고 관계도를 빠르게 만든다.
  2. 관계도를 바탕으로 문제를 쉽게 해결한다.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges