프로그래머스 2022 KAKAO BLIND RECRUITMENT Level 1 문제 신고 결과 받기 문제를 Java를 이용해 풀어보았다.
HashSet과 HashMap을 이용하면 쉽게 풀 수 있다.
문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/92334
결국 이름이 중요한 게 아니라 몇 번째 유저가 몇 번이나 신고 받았으며, 그 신고 횟수가 k
번 이상인지가 중요한 것이기 때문에 오로지 숫자로만 소통하도록 코드를 작성했다.
- 이름별 번호 붙여주기:
HashMap<String, Integer> map = new HashMap<>();
- 몇 번째 유저가 몇 번 신고 당했는지:
ArrayList< HashSet<Integer> > list = new ArrayList<>();
각 유저는 오로지 몇 번 유저인지로만 통하는 것이다. 위 두 변수들을 초기화해주기 위해 다음과 같은 작업을 가장 먼저 했다.
for(int i=0; i<id_list.length; i++) {
list.add(new HashSet<>()); // 유저가 신고 당한 횟수 위한 변수
map.put(id_list[i], i); // 유저 이름별 번호 붙여주기
}
위에서 선언한 list
의 몇 번째 녀석이 누굴 신고했는지 HashSet에 추가해주면 된다. 이를 코드로 표현하면 다음과 같다.
for(String rep: report){
StringTokenizer stk = new StringTokenizer(rep);
int whoReports = map.get(stk.nextToken());
int whoGotReported = map.get(stk.nextToken());
list.get(whoReports).add(whoGotReported);
}
각 list
의 HashSet에 있는 모든 원소들을 돌며 각자 신고 당한 횟수를 갱신해주면 된다. 이를 위해 유저별 신고횟수를 저장하기 위해 int[] howManyReported
를 선언해줬다.
int[] howManyReported = new int[id_list.length];
for(int i=0; i< id_list.length; i++){
HashSet<Integer> cur = list.get(i);
for(int target: cur)
howManyReported[target]++;
}
이렇게 각자의 신고 당한 횟수를 배열에 저장했으면 다음 작업으로 넘어가보자.
다시 한 번 list
를 쭉 순회하며 HashSet에 들어있는 번호에 해당하는 howManyReported
의 값이 k
번 이상인지 확인해서 맞으면 1
씩 추가해주면 된다.
for(int i=0; i<id_list.length; i++){
HashSet<Integer> cur = list.get(i);
int cnt = 0;
for(int target: cur)
if(howManyReported[target]>=k) cnt++;
answer[i] = cnt;
}
그리고 answer
을 return 해주면 된다.
아래는 내가 제출한 전체 코드다.
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.StringTokenizer;
public class ReportResult {
static HashMap<String, Integer> map = new HashMap<>();
static ArrayList< HashSet<Integer> > list = new ArrayList<>();
static int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
int[] howManyReported = new int[id_list.length];
for(int i=0; i<id_list.length; i++) {
list.add(new HashSet<>());
map.put(id_list[i], i);
}
for(String rep: report){
StringTokenizer stk = new StringTokenizer(rep);
int whoReports = map.get(stk.nextToken());
int whoGotReported = map.get(stk.nextToken());
list.get(whoReports).add(whoGotReported);
}
for(int i=0; i< id_list.length; i++){
HashSet<Integer> cur = list.get(i);
for(int target: cur)
howManyReported[target]++;
}
for(int i=0; i<id_list.length; i++){
HashSet<Integer> cur = list.get(i);
int cnt = 0;
for(int target: cur)
if(howManyReported[target]>=k) cnt++;
answer[i] = cnt;
}
return answer;
}
public static void main(String[] args) throws IOException {
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] id_list = {"con", "ryan"};
String[] report = {"ryan con", "ryan con", "ryan con", "ryan con"};
int k = 3;
int[] result = solution(id_list, report, k);
for(int a: result) bfw.write(a + " ");
bfw.close();
}
}
HashSet과 HashMap을 이용해서 오로지 유저들을 번호로만 소통하도록 하는 게 풀이의 주요 포인트였다. 더 짧게 멋있게 푼 분들도 많던데 나는 이렇게 풀어도 금방 풀었다. 아는 만큼으로 최대한 정확하게 빠르게 풀자.