매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅
오늘 푼 문제는 '신고 결과 받기'
카카오 기출문제라서 굉장히 유명하기도 하고, 또 여러번 풀어봤지만 단 한번도 내 힘으로 풀지 못했던 정말 마의 문제...ㅋㅠㅠㅠㅠㅠㅠㅠ
근데 오늘은 정말 (코드가 개같지만 ㅠㅠ) 내 스스로의 힘으로 풀어본 역사적인(ㅋㅋ) 날이다.
사실 자바로는 결국 시간초과 문제를 해결하지 못해 풀지 못했지만 자바스크립트로는 풀어냈다... 와우.
이게 되는구나 싶었던.. 힘들었던 1시간 남짓.
얼마전에 리덕스를 새로 공부하기 시작하면서 새삼 자바스크립트 문법이 너무 어렵게 느껴졌고, '객체'를 활용하는 방법에 대해 다시 확인하게 됐는데.
오늘 문제를 풀면서는 객체를 새로 만들어내는 방법을 활용했고 코드가 많이 더러워지긴 했지만(;;) 다행스럽게 해결할 수 있었다.
README 파일에도 쓰긴 했지만..
이 문제만 보면 정말 마음이 있는대로 꺾여서(ㅠㅠ 중꺾마!!!!!!!!!!!! 하!!!!!!) 솔직히 문제만 봐도 기분이 좋지 않은데(ㅎㅎ)
어쨌든 자바스크립트로 풀어보았다는 것에 힘을 얻어 꼭!! 자바로도 다시 풀어내보고 싶다.
오늘은 문제가 너무 길어서 링크로 대체^^
위에도 써놨지만 시간초과 문제가 7개 정도 해결되지 않아서 통과되지 않아씀.
사실 코드를 치면서도 '이거 시간초과 문제 백퍼 뜰 것 같다...' 싶었는데 해결점을 찾지 못했다.
그래도 실패가 아니라 통과가 된다는 점에 눈물이 찔끔 ㅠㅠㅋㅋㅋㅋㅋㅋㅋ
카카오한테 고문당하는 느낌이구만. (사실 카카오가 잘못한건 없지. 문제를 못푸는 내 잘못..ㅋㅋ)
import java.util.*;
import java.util.stream.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
Set<String> removingDuplicateReportItem = new LinkedHashSet<>();
removeDuplicateReport(report, removingDuplicateReportItem);
List<String> rawRealReport = removingDuplicateReportItem.stream().collect(Collectors.toList());
Map<String, List<String>> realReportMap = new LinkedHashMap<>();
makeRealReportMap(id_list, rawRealReport, realReportMap, k);
return count(id_list, realReportMap);
}
public void removeDuplicateReport(String[] report, Set<String> set) {
set.addAll(Arrays.asList(report));
}
public void makeRealReportMap(String[] id_list, List<String> rawRealReport, Map<String, List<String>> realReportMap, int k) {
for (String id : id_list) {
List<String> reportingUsers = new LinkedList<>();
for (String reportHistory : rawRealReport) {
String reportingUser = reportHistory.split(" ")[0];
String reportedUser = reportHistory.split(" ")[1];
if (id.equals(reportedUser)) {
reportingUsers.add(reportingUser);
}
}
if (reportingUsers.size() < k) {
continue;
}
realReportMap.put(id, reportingUsers);
}
}
private int[] count(String[] id_list, Map<String, List<String>> realReportMap) {
Map<String, Integer> realResult = new LinkedHashMap<>();
for (String id : id_list) {
realResult.put(id, 0);
}
List<List<String>> lists = realReportMap.values().stream().collect(Collectors.toList());
for (List<String> list : lists) {
for (String reportingUser : list) {
realResult.put(reportingUser, realResult.get(reportingUser) + 1);
}
}
int[] result = new int[id_list.length];
for (int i = 0; i < id_list.length; i += 1) {
if (!realResult.containsKey(id_list[i])) {
result[i] = 0;
continue;
}
result[i] = realResult.get(id_list[i]);
}
return result;
}
}
오늘의 컨셉은 '객체'를 사용해보자!
array에 map을 활용해서 그 원소를 객체화 하여 리턴하는 방법이 좋은 방법인지는 모르겠으나..
갠적으론 이렇게 하니 좀 더 명확하게 읽히는 부분들이 있어서 좋았다.
function makeReportedArray(id_list, reportArray) {
return id_list.map((value) => ({
reportedId: value,
reportingUsers: reportArray.filter((report) => report.reportedUser === value)
.map((item) => item.reportingUser),
}));
}
function solution(id_list, report, k) {
const set = new Set();
report.forEach((value) => set.add(value));
const reportWithoutDuplicateHistory = [];
set.forEach((value) => reportWithoutDuplicateHistory.push(value));
const realReport = reportWithoutDuplicateHistory.map((value) => ({
reportingUser: value.split(' ')[0],
reportedUser: value.split(' ')[1],
}));
const reportedArray = makeReportedArray(id_list, realReport);
const realReportedArray = reportedArray.filter((value) => value.reportingUsers.length >= k);
const result = id_list.map((value) => ({
reportingUser: value,
count: realReportedArray.filter((item) => item.reportingUsers.includes(value)).length || 0,
}));
return result.map((value) => value.count);
}
자바스크립트로 문제를 풀다보면 문법을 아직도 너무 모른다는 생각이 들기도 하고,
특히 더 활용할 수 있는 모던자바 문법들이 있을텐데 이를 충분히 활용하지 못하고 있단 생각이 많이 든다.
강의나 튜토리얼을 통해 확인한 부분들에 대해선 꼭 코딩도장 문제를 풀면서 하나라도 적용해보는 연습을 해보자.