[공부] 코테/Java문제
자바 API 설계 + 컬렉션 조작
woodisco
2025. 7. 3. 21:41
반응형
✅ 문제: 유저의 활동 기록 요약 API 만들기
당신은 어떤 서비스의 백엔드 개발자입니다.
클라이언트에서 유저별 활동 통계를 요청하는 기능을 개발하려고 합니다.
🔧 입력 데이터 예시 (가공된 로그 데이터)
List<Activity> logs = List.of(
new Activity("우주", "LOGIN"),
new Activity("우주", "POST"),
new Activity("우주", "LOGOUT"),
new Activity("민수", "LOGIN"),
new Activity("민수", "POST"),
new Activity("우주", "POST")
);
🔨 목표 결과 (요약 통계)
Map<String, Map<String, Integer>> result = {
"우주" -> {
"LOGIN" -> 1,
"POST" -> 2,
"LOGOUT" -> 1
},
"민수" -> {
"LOGIN" -> 1,
"POST" -> 1
}
}
📘 Activity 클래스 정의
class Activity {
String username;
String action;
Activity(String username, String action) {
this.username = username;
this.action = action;
}
// getter 추가 필요 시 자유롭게 사용
}
🎯 요구사항
- 사용자 이름별로 활동(action)의 개수를 집계하시오.
- 결과는 Map<String, Map<String, Integer>> 형태여야 합니다.
- Map<String, Integer>는 그 사용자의 액션별 개수 통계입니다.
- HashMap, getOrDefault(), containsKey() 등을 자유롭게 활용하세요.
✅ 정답 코드 (Java 8+)
import java.util.*;
class Activity {
String username;
String action;
Activity(String username, String action) {
this.username = username;
this.action = action;
}
public String getUsername() {
return username;
}
public String getAction() {
return action;
}
}
public class ActivityStats {
public static void main(String[] args) {
List<Activity> logs = List.of(
new Activity("우주", "LOGIN"),
new Activity("우주", "POST"),
new Activity("우주", "LOGOUT"),
new Activity("민수", "LOGIN"),
new Activity("민수", "POST"),
new Activity("우주", "POST")
);
Map<String, Map<String, Integer>> result = new HashMap<>();
for (Activity activity : logs) {
String user = activity.getUsername();
String act = activity.getAction();
// 내부 Map이 없으면 새로 만들고 가져오기
Map<String, Integer> userMap = result.computeIfAbsent(user, k -> new HashMap<>());
// 해당 액션의 개수 누적
userMap.put(act, userMap.getOrDefault(act, 0) + 1);
}
// 결과 출력
for (String user : result.keySet()) {
System.out.println(user + " ▶ " + result.get(user));
}
}
}
※ computeIfAbsent()
키(user)가 없으면 → new HashMap<>()을 만들고 넣어줌
있으면 → 기존 값을 반환
이건 containsKey() + put()보다 훨씬 깔끔하고 안전해요
📌 출력 예시
우주 ▶ {LOGIN=1, POST=2, LOGOUT=1}
민수 ▶ {LOGIN=1, POST=1}
🧠 실무 포인트
- 로그/이벤트/액션 통계를 낼 때 많이 씀
- Map<String, Map<...>> 구조는 다중 기준(group by) 요약할 때 자주 사용
- REST API 응답 구조를 만들 때도 이런 식으로 중첩 Map을 만들어 반환함
반응형