본문 바로가기
알고리즘/알고리즘

[JAVA] 프로그래머스 : 신고 결과 받기

by 두둠칫 2022. 7. 31.

https://school.programmers.co.kr/learn/courses/30/lessons/92334?language=java 

 

프로그래머스

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

programmers.co.kr

 

1. Map 사용하는 문제

첫 코드는 다음과 같다

 

import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = {};
        
        HashMap<String, List<String>> r = new HashMap<String, List<String>>(); // <신고자, 피신고자>
        HashMap<String, Integer> rr = new HashMap<String, Integer>(); // <피신고자, 신고수>
        
        for(int i=0; i<id_list.length; i++){
            r.put(id_list[i], new ArrayList<String>());
            rr.put(id_list[i], 0);
        }
        
        for(int i=0; i<report.length; i++){
            String[] nr = report[i].split(" ");
            
            if(!r.get(nr[0]).contains(nr[1])){
                r.get(nr[0]).add(nr[1]);
                rr.put(nr[1], rr.get(nr[1]) + 1);
            }
        }
        
        answer = new int[id_list.length];
        
        for(int i=0; i<id_list.length; i++){
            List<String> tmp = r.get(id_list[i]);
            int tmpCnt = 0;
            for(int j=0; j<tmp.size(); j++){
                if(rr.get(tmp.get(j))>=k){
                    tmpCnt++;
                }
            }
            answer[i]=tmpCnt;
        }
        
        return answer;
    }
}

 

2. 중간정리

HashMap

 - put, get, containKey, remove, size

 - 기존 key의 value값 바꾸기 : map.put(map.get(key), new_value);

 

array

 - array의 크기는 array.length <-> List의 크기는 list.size()

 - 초기화 : int[] arr; arr = new int[size];

 

 

3. 코드보완

 - stream 활용 : distinct, collect, Collectors

 - Collectors 알아보기

 - 향상된 for문..

 

 

4. Collectors

- collect() : stream의 최종 element를 수집 ex) Array.stream(var).*.collect(Collectors.*);

- Collectors<T, A, R> : <T 요소, A 누적기, R 저장될컬렉션> : collect의 매개값

Stream<Student> totalStream = totalList.stream();
Stream<Student> maleStream = totalStream.filter(s -> s.getSex() == Student.Sex.MALE);

Collector<Student, ?, List<Student>> collector = Collectors.toList();
List<Student> maleList = maleStream.collect(collector);

// ==

List<Student> maleList = totalList.stream()
            .filter(s -> s.getSex() == Student.Sex.MALE)
            .collect(Collectors.toList());

// 출처 : https://cornswrold.tistory.com/384