일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- guard
- pagination
- bootstrap
- SWiFT
- EC2
- 옵셔널
- CKEditor4
- 차이점
- 사용법
- jQuery
- 자료불러오기
- Xcode
- 2차원 객체배열
- switch-case
- AWS
- class
- 제어문
- 클래스
- Spring
- 함수
- amazon
- PHP
- 상속
- DatePicker
- 객체
- Gradle
- 전의 의존성
- Java
- CodeIgniter
- programmers
- Today
- Total
not bad 한 개발
프로그래머스 - 신고 결과 확인 본문
문제 : https://programmers.co.kr/learn/courses/30/lessons/92334
github : https://github.com/delight-HK3/programmers_study/tree/main/programmers
(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, 계정정지 제한 수
}
}
'프로그래머스' 카테고리의 다른 글
프로그래머스 - 3진법 뒤집기 (0) | 2022.05.10 |
---|---|
프로그래머스 - 나머지가 1이 되는 수 찾기 (0) | 2022.05.09 |