Step-by-Step

[Java] 프로그래머스 - 신고 결과 받기 본문

언어/JAVA

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

희주(KHJ) 2022. 5. 20. 00:33

 

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

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

특정 회원이 신고를 k번 이상 받게 되면, 해당 회원은 정지된다.

회원들이 각자 신고하여 신고대상이 정지를 받게 된 경우의 횟수를 구하는 문제이다.

 

일단 모든 회원의 신고 후 정지된 사례 개수를 리턴해야하기 때문에 answer을 0으로 초기화한다.

int[] answer = new int[id_list.length];

 

그리고 특정 회원이 정지를 받았을 때, 해당 회원을 신고한 사람들을 찾아서, answer 값을 증가시켜야 하기 때문에,

각 회원의 index값을 저장하는 배열도 만들었다.

// 해당 사람의 index
Map<String,Integer> idx = new HashMap<>();

 

 

그리고 (회원, 신고한 사람들) 형식으로 데이터를 저장해야하고, 한 사람이 똑같은 사람에게 여러번 신고할 경우 1번만 인정되므로 Hash를 이용하였다.

// 신고 리스트 (신고 당하는 사람, 신고한 사람 List)
Map<String,HashSet<String>> repList = new HashMap<>();

 

 

그리고 나머지 코드를 작성하였다.

		for(int i=0; i<id_list.length; i++) {
        	idx.put(id_list[i], i);
        	repList.put(id_list[i], new HashSet<>());
        }
       
        
        for(int i=0; i<report.length; i++) {
        	String[] s = report[i].split(" ");
        	HashSet<String> hs = repList.get(s[1]);
        	hs.add(s[0]);
        	repList.put(s[1], hs);
        }
       
        for(int i=0; i<id_list.length;i++) {
        	HashSet<String> hs = repList.get(id_list[i]);
        	if(hs.size()>=k)
        		for(String str : hs)		// 신고한사람 1씩 증가
        			answer[idx.get(str)]+=1;
        }

 

 

처음에는 뭣도 모르고 Hash를 사용하지 않았었다. 그랬더니 시간초과가 났다.

실패한 방식은 다음과 같다.

1. ArrayList에 report를 하나씩 집어 넣어 만약 이미 있는 값이라면 (contains 사용) 넣지 않도록 작성

2. ArrayList를 이용하여 <String, ArrayList<String>> 형식으로 해당 사람을 신고한 사람들을 List로 저장

 

중복값을 허용하지 않는 문제는 속도로 보나 코드의 길이로 보나 Hash가 짱이다!

 

또, 객체지향 언어의 장점을 살려 별도의 class 작성을 통해 코드를 작성해도 될 듯 하다.

    public class repPerson{
    	String person;
    	HashSet<String> reportList;
    	HashSet<String> reportedList;
    }

 

이 코드를 생각하고 작성까지 했지만 급한 마음에 사용하지 않았다 ..ㅋㅋㅋㅋㅋ

이후 정답을 맞추고 다른 사람 풀이를 보니 이런 식으로 작성한 분이 계셨었다~!

Comments