문제 : programmers-신고결과받기
프로그래머스 기준 레벨 1은 에바같고.. 레벨 2정도는 될 것 같다. 백준기준 한 실버5~3정도 수준인듯. 결국 서브 문제로 '잘' 나누고 적절한 자료구조를 '잘' 쓰면 된다. 사실 엄밀히 따지자면 기본적인 자료구조들을 다 알고있다는 가정하에 그냥 제시된대로 단순 구현만 하면 되는 문제니 레벨 1이 맞는것 같기도 하다.
아무튼 내 경우엔 다음의 단계로 나누어서 풀었다.
1. 문자열을 숫자로 매칭 (안해도 되지만, 효율성을 높히려면 하면 좋다) - HashMap 사용
2. 신고당한 횟수를 센다 - int[] 사용 / 이 때 중복되는 신고는 걸러줘야 한다 - HashSet[] 사용 / 이 때 자신을 신고한 사람의 리스트를 유지한다 - ArrayList[] 사용
3. '2'에서 신고당한 횟수가 k 이상인 사람을 신고했던 사람들이 ArrayList[k] 리스트에 있으므로, 카운팅 해준다.
4. 결과 리턴
코드 : github
/**
* 문제 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.StringTokenizer;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int n = id_list.length;
HashMap<String, Integer> idToNum = new HashMap<>();
for (int i = 0; i < n; i++) idToNum.put(id_list[i], i);
int[] reportCnt = new int[n];
HashSet<Integer>[] chkDuplicatedReport = new HashSet[n];
for (int i = 0; i < n; i++) chkDuplicatedReport[i] = new HashSet<>();
ArrayList<Integer>[] reportNumList = new ArrayList[n];
for (int i = 0; i < n; i++) reportNumList[i] = new ArrayList<>();
for (int i = 0; i < report.length; i++) {
StringTokenizer st = new StringTokenizer(report[i]);
int from = idToNum.get(st.nextToken());
int to = idToNum.get(st.nextToken());
if (!chkDuplicatedReport[from].contains(to)) {
chkDuplicatedReport[from].add(to);
reportCnt[to]++;
reportNumList[to].add(from);
}
}
int[] answer = new int[n];
for (int i = 0; i < n; i++) {
if (reportCnt[i] < k) continue;
for (int from : reportNumList[i]) {
answer[from]++;
}
}
return answer;
}
}
'PS > Programmers' 카테고리의 다른 글
[자바] 프로그래머스 - 행렬과 연산 (Lv4, Java) (2) | 2022.08.20 |
---|---|
[자바] 프로그래머스 - 프린터 (programmers java) (0) | 2022.05.04 |
[자바] 프로그래머스 - 도둑질 (코딩테스트 연습 Lv4) (0) | 2022.04.21 |
[자바] 프로그래머스 - 타겟 넘버 (코딩테스트 연습 Lv2) (0) | 2022.04.18 |
[자바] 프로그래머스 - 가사 검색 [코딩테스트 연습 Lv4] (0) | 2022.04.10 |
댓글