프로그래머스-2022 KAKAO BLIND RECRUITMENT ( 신고 결과 받기 by Java )

Flash·2022년 2월 8일
0

Programmers-Algorithm

목록 보기
23/52
post-thumbnail

Set과 Map을 이용한 구현

프로그래머스 2022 KAKAO BLIND RECRUITMENT Level 1 문제 신고 결과 받기 문제를 Java를 이용해 풀어보았다.
HashSetHashMap을 이용하면 쉽게 풀 수 있다.

문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/92334


각 유저 이름별로 번호 붙여주기

결국 이름이 중요한 게 아니라 몇 번째 유저가 몇 번이나 신고 받았으며, 그 신고 횟수가 k번 이상인지가 중요한 것이기 때문에 오로지 숫자로만 소통하도록 코드를 작성했다.

  1. 이름별 번호 붙여주기: HashMap<String, Integer> map = new HashMap<>();
  2. 몇 번째 유저가 몇 번 신고 당했는지: 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); // 유저 이름별 번호 붙여주기
}

report 내용 읽으며 누가 누구 신고했는지 데이터 저장하기

위에서 선언한 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);
}

누가 몇 번이나 신고 당했는지

listHashSet에 있는 모든 원소들을 돌며 각자 신고 당한 횟수를 갱신해주면 된다. 이를 위해 유저별 신고횟수를 저장하기 위해 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();
    }
}

HashSetHashMap을 이용해서 오로지 유저들을 번호로만 소통하도록 하는 게 풀이의 주요 포인트였다. 더 짧게 멋있게 푼 분들도 많던데 나는 이렇게 풀어도 금방 풀었다. 아는 만큼으로 최대한 정확하게 빠르게 풀자.

profile
개발 빼고 다 하는 개발자

0개의 댓글