문제 출처 : 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;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 양궁 대회 (Java) (0) | 2024.02.19 |
---|---|
[Programmers] 미로 탈출 명령 (Java) (0) | 2024.02.12 |
[Programmers] 기사단원의 무기 (Java) (0) | 2024.01.29 |
[Programmers] 이웃한 칸 (Java) (0) | 2024.01.26 |
[Programmers] 주사위 고르기 (Java) (0) | 2024.01.25 |