문제

 

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

 

프로그래머스

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

programmers.co.kr

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
  • k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
    • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

 

제한사항도 존재하는데 주로, 인자 유효성 부분이다.

그런데 제거해도 동작을 한다. 즉, 구현할 필요 없다.

 

 

 


코드

import static java.util.stream.Collectors.*;

import java.util.*;
import java.util.stream.Stream;


class Solution6 {
	public static void main(String[] args) {
		Solution6 s = new Solution6();
		int[] solution = s.solution(new String[] {"muzi", "frodo", "apeach", "neo"}
			, new String[] {"muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"}
			, 2);
		System.out.println(Arrays.toString(solution));
		
	}
	
	
	final int[] FAIL = new int[] {};
	//id_list 이용자 아이디 , 신고 정보 배열 report, 신고가정지로될 횟수
	public int[] solution(String[] id_list, String[] report, int k) {
		//알람을 몇번 받을지 저장할 맵, 순서가 중요하므로 Linked를 사용했다.
		Map<String, Integer> alramMap = new LinkedHashMap<>();
		//내가 누굴 신고했는지 저장할 맵, 순서가 중요하므로 Linked를 사용했다.
		Map<String, List<String>> reportedMap = new LinkedHashMap<>();
		
		//받은 인자에 맞게, 초기화
		Stream.<String>of(id_list).forEach(user -> {
			reportedMap.put(user, new ArrayList<String>());
			alramMap.put(user, 0);
		});
		
		//신고당한 횟수
		Stream.<String>of(report) // 신고 목록으로 스트림 생성
				.distinct() // 한 유저가 한 유저를 중복 신고한 경우 1번으로 처리
				.peek( _report -> System.out.println("신고 = "+_report ) )
				.map(_report ->{
					String[] users = _report.split(" ");
					//[0] 원고, [1] 피고
					reportedMap.get(users[0]).add(users[1]);//내 리스트에 피고 저장
					return users[1];})// 피고인으로 구성된 스트림
				.peek( badGuy -> System.out.println("신고 당한 유저 = "+badGuy +"\n" ))
				.collect(groupingBy(
							user->user, 
							LinkedHashMap<String, Integer>::new , 
							collectingAndThen(counting(), Long::intValue)))
				//내가 몇 번 신고 당했는지, 맵으로 리턴 key 내id, value 신고당한 횟수
				//신고당한 적 없다면 맵에 존재하지 않는다.
				.forEach((badUser, count)->{
					if(count>=k ) {// k 번 이상일 경우 계정 정지, 해당 사용자를 신고한 사람은 알림을 받는다.
						reportedMap.forEach( (user, badUsers)->{
							if(badUsers.contains(badUser)) {
								alramMap.put(user, alramMap.get(user)+1 );
							}
						});
					}
				});
		//맵을 int[]로 변환리턴
		return alramMap.values().stream().mapToInt(Integer::intValue).toArray();
	}
}

결과

신고 = muzi frodo
신고 당한 유저 = frodo

신고 = apeach frodo
신고 당한 유저 = frodo

신고 = frodo neo
신고 당한 유저 = neo

신고 = muzi neo
신고 당한 유저 = neo

신고 = apeach muzi
신고 당한 유저 = muzi

[2, 1, 1, 0]

입력 받은 순서대로 값을 리턴해야된다. 그래서 순서를 유지하는 맵을 사용했다.

'자료구조&알고리즘 > Level1' 카테고리의 다른 글

숫자 문자열과 영단어  (0) 2022.10.01
성격 유형 검사하기  (0) 2022.09.26
올바른 괄호  (1) 2022.09.23
크레인 인형뽑기 게임  (1) 2022.09.21
신규 아이디 추천  (0) 2022.09.18

+ Recent posts