개발공부/코딩테스트 연습문제

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

ku-na 2022. 1. 17. 14:20

문제 설명과 제한사항

 

문제가 길다.

1. id_list : 유저

2. report : 신고 내역 ex) "kuna naku" -> kuna가 naku를 신고

3. k이상 신고가 들어오면 정지 + 신고자(위의 예에서 kuna)에게 메일

4. 메일을 id_list별로 유저들이 몇통을 받는지.

 

풀이

import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] tmp = new int[id_list.length];
        int[] answer = new int[id_list.length];
        Set<String> set = new HashSet<String>(Arrays.asList(report));
        String[] reportSet = new String[set.size()];
        
        Iterator<String> it = set.iterator();
        for(int i = 0; i < set.size(); i++){
            reportSet[i] = it.next();
        }
        
        for(int i = 0; i < reportSet.length; i++){
            String[] reportSplit = reportSet[i].split(" ");
            tmp[Arrays.asList(id_list).indexOf(reportSplit[1])]++;
        }
        
        for(int i = 0; i < reportSet.length; i++){
            String[] reportSplit = reportSet[i].split(" ");
            if(tmp[Arrays.asList(id_list).indexOf(reportSplit[1])] >= k){
                answer[Arrays.asList(id_list).indexOf(reportSplit[0])]++;
            }
        }
        return answer;
    }
}

코드 설명

 반복문의 중첩(시간복잡도)를 신경쓰다보니 코드가 더러워짐.

파트는 Iterator 부분을 1

첫번째 반복문을 2

두번째 반복문을 3 으로 가정한다.

0. 선언 : tmp -> 신고된 횟수를 id_list 순서대로 저장

            set,reportSet -> 중복방지를 위한 set

1. set으로 중복을 없앤 후 배열로 저장하기 위한 부분.

2. reportSet(중복을 없앤 report)을 " " 기준으로 자름 ex) "kuna naku" -> ["kuna","naku"]

   그리고 reportSplit[1] -> 위의 예 naku 에 해당하는 id_list에 인덱스를 가져와서

   tmp(신고당한 누적 횟수)에 인덱스에 해당하는 숫자를 ++

   그러면 결과적으로 naku가 있는 index 에 신고 횟수가 ++ 됨.

3. 2와 같은 방식으로 신고 횟수를 k와 비교해서 answer에 ++ 해줌

 

++

생각보다 빠르게 풀렸음.

근데 또 몇일 쉬었다고 Iterator 랑 set 선언이 기억이 안남... 그리고 indexOf는 기억나는데 arrays.asList 까먹음

1. SET : Set<String> a = new HashSet<String>();

    -> 배열을 셋으로 : Set<String> a  = new HashSet<Strung>(Arrays.asList(배열));

 

2. Iterator : set에서 데이터를 하나씩 가져오기 위함

   Iterator b = a.iterator();

   -> b.hasNext() : 보통 while문에서 조건으로 사용됨

   -> b.next() : 인자 하나씩 가져옴.

 

3. indexOf(<T> a) : List에서 a에 해당되는 인덱스를 반환. 

  List<String> a = new List<String>();

  a.indexOf("Kuna");  : "Kuna"가 있는 인덱스를 반환

  -> 배열에서의 사용법?

  Arrays.asList() : 배열을 리스트로 반환

   -> Arrays.asList(배열 b).indexOf("Kuna");

       배열 b에서 Kuna가 있는 인덱스를 반환