ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - Lv1. 신고 결과 받기
    PS 2022. 2. 28. 14:30

    문제 : 신고 결과 받기

    • 문제 내용은 여기.
    • 쉽게 말해, "신고자 피신고자" 형태로 신고 메시지가 들어올건데, 이를 적절히 잘 가공하고 카운트해서, '회원별 정지회원신고횟수' 배열을 리턴하라는 것. '정지회원 신고횟수' 배열임을 잊고 '정지회원을 신고한 회원' 배열을 리턴하려고 하는 순간 문제의 의도와는 맞지 않게 번거롭게 된다(처음에 이렇게 풀었다).

    풀이

    class Solution {
        public int[] solution(String[] id_list, String[] report, int k) {
            int[] answers = new int[id_list.length]; // 답장나갈 숫자 배열 - ID순 
            Set<String> reports = new HashSet<String>(); // 중복을 제거한 신고 내용
            for (String r : report) reports.add(r);
            Map<String, Integer> report_counts = new HashMap<String, Integer>(); // ID별 신고당한 숫자 
            for (String id : id_list) report_counts.put(id, 0);
    
            // 신고당한 횟수를 카운팅 
            for (String r : reports) {
                String[] tmp = r.split(" ");
                report_counts.put(tmp[1], report_counts.get(tmp[1]) + 1);
            }
    
            // 카운팅 된 신고당한 횟수를 k와 비교하여 클 경우, 리턴 배열의 [신고자번째]에 += 1 
            for (String r : reports) {
                String[] tmp = r.split(" ");
                if (report_counts.get(tmp[1]) >= k)
                    answers[Arrays.asList(id_list).indexOf(tmp[0])] += 1;
            }
    
            return answers;
        }
    }
    • 코드 길이가 짧고 주석을 잘 남겨놔서 설명은 생략.

    후기

    1 ) 처음에는 for문 안에서 String[] tmp를 사용하지 않고 split()이 필요할 때마다 호출했었다. split()으로 똑같은 배열을 중복 생성하는게 많이 비효율적일까 싶어서(당연히 비효율적이겠지만 어느 정도 차이가 날지 궁금했다), 나중에 String[] tmpsplit() 결과를 담아 사용해 보았는데... 뜻밖에도 속도는 거의 차이가 없었다.
    2 ) 쓸 때마다 까먹어서 구글에 검색하고 사용하는 메서드가 있다. 바로 Arrays.asList()다(지금도 잠깐 까먹었음). Java에서 배열은 indexOf()sort()도 지원하지 않기 때문에, List 같은 기능을 사용하고 싶을때 유용하다.

    댓글

Designed by Tistory.