문제: https://school.programmers.co.kr/learn/courses/30/lessons/92334
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. 정리
- HashMap을 이용하여 신고 관계도를 빠르게 만든다.
- 관계도를 바탕으로 문제를 쉽게 해결한다.
출처: 프로그래머스 코딩 테스트 연습,
https://school.programmers.co.kr/learn/challenges
'컴퓨터 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 12985번: 예상 대진표 [Java] (0) | 2023.08.22 |
---|---|
프로그래머스 - 42885번: 구명보트 [Java] (0) | 2023.08.21 |
프로그래머스 - 172928번: 공원 산책 [Java] (0) | 2023.08.19 |
프로그래머스 - 178871번: 달리기 경주 [Java] (0) | 2023.08.18 |
프로그래머스 - 150370번: 개인정보 수집 유효 기간 [Java] (0) | 2023.08.17 |