티스토리 뷰
algorithm/programmers
[프로그래머스/자바] 신고 결과 받기 풀이 - 2022 KAKAO BLIND RECRUITMENT
hrniin 2022. 11. 17. 01:54728x90
https://school.programmers.co.kr/learn/courses/30/lessons/92334
2022 KAKAO BLIND RECRUITMENT의 Level 1 문제다.
사용자별 신고 여부를 저장할 boolean 2차원 배열 report_yn을 생성했다.
만약 report_yn[i][j]가 true라면 i번째의 사용자가 j번째의 사용자를 신고한 것이다.
HashMap<String, Integer> map = new HashMap<>();
for(int i=0;i<n;i++)
map.put(id_list[i], i); // 각 사용자 별로 인덱스 부여
이 때 String으로 된 사용자가 몇번째의 사용자인지 바로 알 수 있도록
HashMap에 String을 key로, Integer를 value로 저장했다.
for(int i=0;i<report.length;i++) {
st = new StringTokenizer(report[i]);
// 사용자의 인덱스 찾기
int userIdx = map.get(st.nextToken());
int reportIdx = map.get(st.nextToken());
if(!report_yn[userIdx][reportIdx]) { // 이미 같은 신고를 한 경우 무시
report_yn[userIdx][reportIdx] = true;
report_cnt[reportIdx]++;
}
}
중복된 신고를 처리할 때도 report_yn이 true인지 false인지만 검사하면 된다.
report_yn가 true라면 이미 같은 신고를 했다는 뜻이므로 무시한다.
또한 false라면 아직 신고를 한적이 없다는 뜻이므로 true로 바꾸고, 사용자의 신고 횟수를 증가시킨다.
for(int i=0;i<n;i++) {
if(report_cnt[i] >= k) {
for(int j=0;j<n;j++)
if(report_yn[j][i]) // j가 i를 신고했다면
mail[j]++;
}
}
또한 메일이 몇번 발송되는지 카운트할 때도 report_yn을 탐색해 true라면
메일 횟수를 저장할 mail[]의 값을 증가시키면 된다.
이용 정지된 사용자를 누가 신고했는지 알기 위해서는
report_yn을 가로가 아닌 세로로 탐색해야한다.
String 사용자의 인덱스를 찾기 위해 사용한 HashMap을 제외하고는
모두 인접배열 형태를 사용하므로 속도가 빠르다.
전체 코드
import java.util.StringTokenizer;
import java.util.HashMap;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
StringTokenizer st;
int n = id_list.length;
boolean[][] report_yn = new boolean[n][n]; // 사용자별 신고 여부
int[] report_cnt = new int[n]; // 신고 횟수
int[] mail = new int[n]; // 메일 수
HashMap<String, Integer> map = new HashMap<>();
for(int i=0;i<n;i++)
map.put(id_list[i], i); // 각 사용자 별로 인덱스 부여
for(int i=0;i<report.length;i++) {
st = new StringTokenizer(report[i]);
// 사용자의 인덱스 찾기
int userIdx = map.get(st.nextToken());
int reportIdx = map.get(st.nextToken());
if(!report_yn[userIdx][reportIdx]) { // 이미 같은 신고를 한 경우 무시
report_yn[userIdx][reportIdx] = true;
report_cnt[reportIdx]++;
}
}
for(int i=0;i<n;i++) {
if(report_cnt[i] >= k) {
for(int j=0;j<n;j++)
if(report_yn[j][i]) // j가 i를 신고했다면
mail[j]++;
}
}
return mail;
}
}
728x90
'algorithm > programmers' 카테고리의 다른 글
[프로그래머스/자바] 주차 요금 계산 풀이 - 2022 KAKAO BLIND RECRUITMENT (0) | 2022.11.17 |
---|---|
[프로그래머스/자바] k진수에서 소수 개수 구하기 풀이 - 2022 KAKAO BLIND RECRUITMENT (0) | 2022.11.17 |
[프로그래머스/자바] H-Index 풀이 (0) | 2022.11.15 |
[프로그래머스/자바] 가장 큰 수 풀이 (0) | 2022.11.15 |
[프로그래머스/자바] K번째수 풀이 (0) | 2022.11.15 |