Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 티스토리챌린지
- join
- 혼공파
- 인프런
- 알고리즘
- Til
- 프로그래머스
- 코틀린
- 카카오코테
- 스터디
- 정처기
- 혼공챌린지
- 혼공단
- 오블완
- groupby
- Android
- Kotlin
- select
- SQL
- java
- 자료구조
- CS
- 안드로이드
- 기술면접
- MySQL
- doitandroid
- 코테
- 자바
- 정보처리기사
- 안드로이드스튜디오
Archives
- Today
- Total
Welcome! Everything is fine.
[프로그래머스/Lv.1] 신고 결과 받기(2022 KAKAO BLIND RECRUITMENT) - Java 본문
728x90
📌 문제
📌풀이
이 문제 전에 푼 '가장 많이 받은 선물'을 풀고 나니 아이디어를 쉽게 떠올릴 수 있었다.
먼저 문제의 규칙을 요약하자면 다음과 같다.
- 동일 유저를 여러 번 신고해도 신고 횟수는 1회로 처리된다.
- k번 이상 신고당한 유저가 있는 경우
- 해당 유저를 신고한 모든 유저가 결과 메일을 받는다.
- k번 이상 신고당한 유저가 없는 경우
- 아무도 결과 메일을 받지 않는다.
그리고나서 HashMap과 int형 배열을 선언하였다.
- HashMap map : 모든 유저의 id와 해당 인덱스를 저장하는 HashMap
- int[] report_list : 각 유저마다 신고당한 횟수를 저장하는 int형 배열, 각 인덱스는 id_list의 인덱스와 동일하다.
- int[][] report_index : 각 유저의 index, 해당 유저가 신고한 유저의 index로 이루어진 int형 2차원 배열
먼저 report 배열을 돌면서 각 유저마다 신고 당한 횟수를 report_list에 넣고, 신고한 유저와 신고 당한 유저를 report_index에 넣는다. 여기서 주의할 점은 만약 report_index[0][1]의 값이 1보다 크다면(=한 유저가 동일 유저를 여러 번 신고했다면) report_list[1]의 값을 하나 빼줘야한다는 점이다. 지금 생각해보니 Set을 사용했다면 중복을 더 쉽게 제거할 수 있었을 것 같다.
그 이후에는 이중 for문으로 id_list를 돌며 report_index가 0이 아닌 경우에만 mail를 증가시켜준 후, 바깥쪽 for문이 끝나면 answer 배열에 mail의 횟수를 저장시켰다. 여기서 i와 j가 같은 경우(자기 자신인 경우)와 k번 이상 신고당한 유저가 아닌 경우를 제외하면 된다.
📌 전체 코드
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < id_list.length; i++) {
map.put(id_list[i], i);
}
int[] report_list = new int[id_list.length];
int[][] report_index = new int[id_list.length][id_list.length];
for (String s : report) {
String[] names = s.split(" ");
String userId = names[0];
String reportId = names[1];
report_list[map.get(reportId)]++;
report_index[map.get(userId)][map.get(reportId)]++;
if (report_index[map.get(userId)][map.get(reportId)] > 1) report_list[map.get(reportId)]--;
}
int[] answer = new int[id_list.length];
for (int i = 0; i < id_list.length; i++) {
int mail = 0;
for (int j = 0; j < id_list.length; j++) {
if (i == j) continue;
int reportCount = report_list[map.get(id_list[j])];
if (reportCount < k) continue;
if (report_index[i][j] != 0) mail++;
}
answer[i] = mail;
mail = 0;
}
return answer;
}
}
'프로그래머스 > Lv.1' 카테고리의 다른 글
[프로그래머스/Lv.1] 가장 가까운 같은 글자 - Java (0) | 2024.04.11 |
---|---|
[프로그래머스/Lv.1] 공원 산책 - Java (0) | 2024.04.11 |
[프로그래머스/Lv.1] 시저 암호 - Java (0) | 2024.04.09 |
[프로그래머스/Lv.1] 같은 숫자는 싫어 - Java (0) | 2024.04.08 |
[프로그래머스/Lv.1] 가장 많이 받은 선물(2024 KAKAO WINTER INTERNSHIP) - Java (0) | 2024.04.08 |