not bad 한 개발

프로그래머스 - 신고 결과 확인 본문

프로그래머스

프로그래머스 - 신고 결과 확인

leebean 2022. 5. 12. 13:33

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

 

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

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

programmers.co.kr

 

github : https://github.com/delight-HK3/programmers_study/tree/main/programmers

 

GitHub - delight-HK3/programmers_study: It is a repository for storing programmers problems.

It is a repository for storing programmers problems. - GitHub - delight-HK3/programmers_study: It is a repository for storing programmers problems.

github.com

(programmers_92334.java 파일입니다.)

 

문제분석

이 문제는 사용자가 다른 사용자에게 신고를 하면 신고 횟수가 누적이 되는데 일정 이상의 신고 횟수를 넘으면 계정을 정지시키고 정지시켰다는 것을 신고자들에게 전달한 후 결과받은 값을 배열로 저장하여 리턴하는 구조입니다.

 

int[] answer = new int[id_list.length];
// answer 정수형 배열을 id_list배열 길이 만큼 초기화
Map<String, HashSet<String>> member = new HashMap<>();
// member 이름의 HashMap을 만드는데 String, String형의 HashMap이 저장되도록 초기화
Map<String, Integer> callmember = new HashMap<>();
// callmember 이름의 HashMap을 만드는데 String, Integer형이 저장되도록 초기화
  • member HashMap은 신고받은 횟수를 저장합니다.
  • callmember HashMap은 문자열을 저장하고 index값을 저장합니다.
  • answer 정수형 배열은 신고받은 후 발송한 메시지 횟수를 저장합니다.

 

for (int i = 0; i < id_list.length; i++) {
	// id_list의 길이만큼 반복 시킨다.
	String name = id_list[i]; // name에 id_list인자값을 저장한다.
	member.put(name, new HashSet<>()); // member Hashmap에 name, HashSet으로 초기화
	callmember.put(name, i); // callmember Hashmap에 name, i값으로 초기화
}

name에는 id_list에 저장되어있는 멤버 이름을 하나씩 저장합니다, member HashMap에 멤버 이름과 HashSet을 저장하여 초기화시킵니다, callmember에는 멤버 이름과 i의 값을 저장하여 최종적으로 answer을 리턴할 때 answer에 값을 저장하는 용도로 활용하기 위해 초기화합니다.

 

for (int i = 0; i < report.length; i++) { // report배열의 갈이 만큼 반복
	String[] str = report[i].split(" "); // 신고자와 신고 받는 자로 문자열 나누기
	String from = str[0]; // 앞의 문자열 저장
	String to = str[1]; // 뒤쪽의 문자열 저장
	member.get(to).add(from); // 신고 받은 자의 size를 1 증가
	// member의 HashMap중에 String은 신고 받은자로 저장하고 HashMap<String>에 신고자를 저장
}

split함수를 사용하여 신고자와 신고받은 자로 분리하여 String형의 변수에 각각 저장한 후 member의 HashMap 중에 String은 신고받은 자로 저장하고 HashMap <String>에 신고자를 저장합니다.

 

for (int i = 0; i < id_list.length; i++) { // id_list배열의 길이 만큼 반복
    HashSet<String> send = member.get(id_list[i]);
    // member의 인자 size값을 send에 저장
    if (send.size() >= k) { // send의 사이즈가 k 보다 큰 경우
        for (String name : send) { // send에는 값 뿐만아니라 신고자의 정보도 포함되어있다.
            answer[callmember.get(name)]++;
            // callmember에 저장되어있는 name의 위치와 똑같이 answer배열의 인자값이 증가
            // 만약 muzi의 위치가 0 이면 answer배열의 0번쨰 위치의 값이 1 증가한다.
        }
    }
}

id_list의 길이만큼 반복을 합니다, HashMap <String> send에 member HashMap의 멤버가 신고받은 횟수를 send에 저장합니다, 만약 send의 size가 k 즉 계정 정지 제한 수 보다 크면 send크기만큼 반복하면서 callmember HashMap에 있는 name과 같은 index의 size를 가져와 answer배열의 인자로 한 후 1을 더해줍니다, 이런 방식으로 반복을 하면 계정이 정지되었다는 사실을 어떤 멤버가 메시지를 얼마나 받았는지 알 수 있습니다.  

 

문제풀이

import java.util.*; // HashMap을 사용하기 위해 util import

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        // answer 정수형 배열을 id_list배열 길이 만큼 초기화
        Map<String, HashSet<String>> member = new HashMap<>();
        // member 이름의 HashMap을 만드는데 String, String형의 HashMap이 저장되도록 초기화
        Map<String, Integer> callmember = new HashMap<>();
        // callmember 이름의 HashMap을 만드는데 String, Integer형이 저장되도록 초기화

        for (int i = 0; i < id_list.length; i++) {
            // id_list의 길이만큼 반복 시킨다.
            String name = id_list[i]; // name에 id_list인자값을 저장한다.
            member.put(name, new HashSet<>()); // member Hashmap에 name, HashSet으로 초기화
            callmember.put(name, i); // callmember Hashmap에 name, i값으로 초기화
        }

        for (int i = 0; i < report.length; i++) { // report배열의 갈이 만큼 반복
            String[] str = report[i].split(" "); // 신고자와 신고 받는 자로 문자열 나누기
            String from = str[0]; // 앞의 문자열 저장
            String to = str[1]; // 뒤쪽의 문자열 저장
            member.get(to).add(from); // 신고 받은 자의 size를 1 증가
            // member의 HashMap중에 String은 신고 받은자로 저장하고 HashMap<String>에 신고자를 저장
        }

        for (int i = 0; i < id_list.length; i++) { // id_list배열의 길이 만큼 반복
            HashSet<String> send = member.get(id_list[i]);
            // member의 인자 size값을 send에 저장
            if (send.size() >= k) { // send의 사이즈가 k 보다 큰 경우
                for (String name : send) { // send에는 값 뿐만아니라 신고자의 정보도 포함되어있다.
                    answer[callmember.get(name)]++;
                    // callmember에 저장되어있는 name의 위치와 똑같이 answer배열의 인자값이 증가
                    // 만약 muzi의 위치가 0 이면 answer배열의 0번쨰 위치의 값이 1 증가한다.
                }
            }
        }
        return answer; // answer 배열 리턴
    }
}
public class test {
    public static void main(String[] args) {
        Solution sol = new Solution(); // sol이름의 객체 생성
        String[] str1 = {"muzi", "frodo", "apeach", "neo"};
        // srt1 배열에 ["muzi", "frodo", "apeach", "neo"] 저장
        String[] str2 = {"muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"};
        // srt2 배열에 ["muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"] 저장
        sol.solution(str1,str2,2);
        // str1, str2, 계정정지 제한 수
    }
}
Comments