IT/알고리즘
[프로그래머스] 신고결과 받기
So1_b
2022. 6. 18. 21:32
https://programmers.co.kr/learn/courses/30/lessons/92334
코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
programmers.co.kr
<문제설명>
arr[ ][ ]의 논리적 구조
인덱스 | 신고된 ID | 신고자 |
0 | muzi | apeach |
1 | frodo | muzi, apeach |
2 | apeach | |
3 | neo | frodo, muzi |
(이때 신고ID의 idex와 id[ ]의 인덱스가 동일함.)
- idx[ ] = 위 표에서 신고자 배열의 인덱스를 의미함. (arr[ ][ * ])
- 신고기록인 report[ ]의 문자열을 공백을 기준으로 신고ID( s[1] ), 신고자( s[0] )으로 나누기 위해 for each문에서 split(" ")을 이용한다.
- id[ ]에서 신고ID의 인덱스를 알아내기 위해 배열(id[ ])을 ArrayList로 변경해 인덱스를 찾는다.
- 신고자를 저장하기 위해 idx[r] == 0이면 중복검사를 하지않고 저장,
idx[r] > 0이면 중복검사 후 저장한다.
- 중복검사는 arr[r]를 set로 변경해 저장할 값을 add한다. 이때 set.size의 값이 동일하면 중복된 값이므로 저장하지 않는다.
- arr[ ][ ]에서 신고자를 의미하는 배열의 길이가 k이상일경우 배열을 List로 변경하고
answer[ id[ ]에서 신고자의 인덱스 ]를 증가시킨다.
import java.util.*;
class Solution {
public int[] solution(String[] id, String[] report, int k) {
int[] answer = new int[id.length];
int[] idx = new int[id.length]; //arr[r][*]의 인덱스
String[][] arr = new String[id.length][id.length]; //신고id [신고자1,신고자2...]
Arrays.fill(idx, 0);
for(String str: report){
String[] s = str.split(" ");
//신고id의 id[]인덱스
int r = new ArrayList<String>(Arrays.asList(id)).indexOf(s[1]);
//arr[r][]에 신고자 저장
if(idx[r]<id.length){
if(idx[r] == 0) arr[r][idx[r]++] = s[0]; //arr[r][*] 비어있음. 그냥 저장
else{ //비어있지 않음. 중복검사ㅇ
Set<String> set = new HashSet<String>(Arrays.asList(arr[r]));
int size = set.size();
set.add(s[0]);
if(size == set.size()) { //중복된 값을 저장한 것.
continue;
}else { //새로운 값을 저장
arr[r][idx[r]++] = s[0]; //신고자 저장.
}
}
}//if
}//for
for(int i=0; i<id.length; i++){
if(idx[i]>=k){ //정지
for(int j= 0; j<idx[i]; j++){
int num = new ArrayList<String>(Arrays.asList(id)).indexOf(arr[i][j]);
answer[num]++;
}
}
}
return answer;
}
}