알고리즘/프로그래머스

[프로그래머스]JAVA - Level1. 신고 결과 받기

K.두부 2022. 9. 4. 20:44
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/92334

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

해당 문제는 왜 Level 1로 되어있는지 잘 모르겠다... 

 

문제에 중복을 제거해야하는 특징이 있기 때문에 HashMap과 HashSet을 사용하면 좋을 것 같다고 생각했다. 이후에 신고자와 대상자를 나눠서 HashSet을 대상자 기준으로 배열을 만들어 해결했다. 

 

HashSet[대상자] 배열에 신고자를 입력해주면 자동으로 중복이 제거 되므로 중복 문제를 쉽게 해결할 수 있다.

for (String name : report) {
    String[] tmp = name.split(" ");
    int tmp_0 = hm.get(tmp[0]);
    int tmp_1 = hm.get(tmp[1]);
    hs[tmp_1].add(tmp_0);
}

HashSet에 신고 내역을 다 입력해줬으면 k보다 더 많은 신고를 받은 대상자만 뽑아서 answer 배열의 해당 인덱스에 뿌려주면 된다.

 

<최종코드>

import java.util.HashMap;
import java.util.HashSet;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        
        HashMap<String, Integer> hm = new HashMap<>(); // [아이디, 해당 아이디 번호]
        HashSet<Integer>[] hs = new HashSet[id_list.length]; // 중복 제거
        
        // 아이디 수만큼 HashSet 생성
        for (int i=0; i<id_list.length; i++) {
            hm.put(id_list[i], i);
            hs[i] = new HashSet<>();
        }
        
        // 신고자와 대상자 나눠서 HashSet에 넣음 (중복 제거)
        for (String name : report) {
            String[] tmp = name.split(" ");
            int tmp_0 = hm.get(tmp[0]);
            int tmp_1 = hm.get(tmp[1]);
            hs[tmp_1].add(tmp_0);
        }
        
        // 신고 당한 횟수가 K를 넘겼을 경우 answer배열에 추가
        for (int i=0; i<id_list.length; i++) {
            if (hs[i].size() >= k) {
                for (int idx : hs[i]) {
                    answer[idx]++;
                }
            }
        }
        
        return answer;
    }
}

 

반응형