Algorithm/Java

프로그래머스 - 신고 결과 받기 java :: 2022 KAKAO BLIND RECRUITMENT

고고마코드 2022. 7. 9. 00:20
반응형
92334

https://school.programmers.co.kr/learn/courses/30/lessons/92334?language=java 

 

프로그래머스

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

programmers.co.kr


 

풀이

저는 신고자의 기준이 아닌 신고 당하는 사람을 기준으로 코드를 작성했습니다.

 

📌결과는 신고자의 index의 값을 구해야 합니다.

📌신고자는 같은 유저를 2번 이상 신고해도 1번으로만 처리됩니다. (중복 신고가 불가능합니다.)

중복이 불가능하다는 뜻은 Set이 활용되기 가장 좋은 문제라는 뜻이기도 합니다.

 

 

📝풀이1

public int[] solution(String[] id_list, String[] report, int k) {
	List<String> id_aryList = Arrays.asList(id_list); // id_list의 index를 편하게 가져오려고 만드는 list
	Map<Integer, Set<Integer>> report_map = new HashMap<>(); // 신고 당하는 자가 기준인 map
	
	for (String re : report) {
		String[] res = re.split(" "); //res[0]: reporter | res[1]: reported
		int reporter = id_aryList.indexOf(res[0]); // 신고자의 index
		int reported = id_aryList.indexOf(res[1]); // 신고 당하는 자의 index
		
		Set<Integer> value = report_map.get(reported);
		if(value == null) { value = new HashSet<>(); }
		value.add(reporter);
		
		report_map.put(reported, value);
	}
	
	int[] answer = new int[id_list.length];
	for(Integer key : report_map.keySet()) {
		Set<Integer> value = report_map.get(key);
		if(value.size() >= k) { // k번 이상 신고당한 사람 
			for(Integer val : value) {
				answer[val]++;
			}
		}
	}
	
	return answer;
}

🎈첫 번째 핵심은 id_aryList 입니다.

결과는 신고자의 index 값이므로, 결과를 수집하기 위한 과정에서도 String이 아닌 index값을 저장하기 위해 id_aryList를 만들었습니다.

 

🎈두 번째 핵심은 Set 입니다. Set은 중복을 제거하기 위한 최고의 Collection입니다.

report_map을 구하는 반복문을 지나고 나면 결과는 아래와 같습니다.

report_map : {0=[2], 1=[0, 2], 3=[0, 1]}

 

 

🎈세 번째 핵심은 정지의 기준인 k번 이상 신고당한 사람을 찾아냅니다.

이미 report_map에 신고당한 자를 기준으로 만들어놨기 때문에 몇 번 신고당했는지 찾기는 쉽습니다.

 

 

⚡️테스트 케이스 처리속도

테스트 1 〉	통과 (0.18ms, 73.7MB)
테스트 2 〉	통과 (0.32ms, 72.6MB)
테스트 3 〉	통과 (764.55ms, 165MB)
테스트 4 〉	통과 (0.39ms, 75.9MB)
테스트 5 〉	통과 (0.43ms, 75.2MB)
테스트 6 〉	통과 (4.58ms, 82.4MB)
테스트 7 〉	통과 (7.35ms, 83MB)
테스트 8 〉	통과 (12.75ms, 97.2MB)
테스트 9 〉	통과 (180.52ms, 136MB)
테스트 10 〉	통과 (177.37ms, 135MB)
테스트 11 〉	통과 (712.19ms, 174MB)
테스트 12 〉	통과 (2.01ms, 78.3MB)
테스트 13 〉	통과 (2.14ms, 78.8MB)
테스트 14 〉	통과 (325.13ms, 136MB)
테스트 15 〉	통과 (683.57ms, 152MB)
테스트 16 〉	통과 (1.44ms, 78.4MB)
테스트 17 〉	통과 (2.03ms, 78.8MB)
테스트 18 〉	통과 (3.17ms, 78.4MB)
테스트 19 〉	통과 (4.61ms, 76.5MB)
테스트 20 〉	통과 (311.92ms, 128MB)
테스트 21 〉	통과 (673.08ms, 160MB)
테스트 22 〉	통과 (0.17ms, 72.9MB)
테스트 23 〉	통과 (0.22ms, 71.7MB)
테스트 24 〉	통과 (0.19ms, 78.1MB)

처음에는 Stream으로도 풀었는데 코드도 엄청 깔끔해지는 것도 아닌데 처리속도가 1000ms 넘는 게 꽤 많아서 너무 마음에 안 들어서 날려버렸어요.

 

반응형