[공부] 코테/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을 만들어 반환함

 

 

반응형