알고리즘/항해99

99클럽 코테 스터디 28일차 TIL + 배열(Group the People Given the Group Size They Belong To)

IamBD 2024. 6. 16. 13:04

오늘의 과제

리트코드 medium으로 분류된 Group the People Given the Group Size They Belong To 입니다.

 

이번 유형도 배열 입니다.

문제

https://leetcode.com/problems/group-the-people-given-the-group-size-they-belong-to/description/

 

 

먼저 문제 요구사항 요약입니다.

 

각 사람의 그룹 크기를 나타내는 배열이 주어질 때 사람들을 각 그룹 크기대로 그룹을 나누면 됩니다. 예제 입력을 따르자면 arr = [3, 3, 3, 3, 3, 1, 3]이면 0~4번째, 6번째 사람은 크기가 3인 그룹이며, 5번째 사람은 크기가 1인 그룹에 속합니다.

 

먼저 사람들을 각 그룹에 맞게 분류하기 위해 HashMap을 사용하여 담아줍니다.

// 그룹 크기별로 사람들을 분류할 해시맵
HashMap<Integer, List<Integer>> map = new HashMap<>();

// 그룹 크기별로 사람들을 해시맵에 추가
for (int i = 0; i < groupSizes.length; i++) {
    int size = groupSizes[i];
    if (!map.containsKey(size)) {
        map.put(size, new ArrayList<>());
    }
    map.get(size).add(i);
}

 

위 로직을 수행하면 map에는 다음과 같이 쌓이게 됩니다.

map = {3 = [0, 1, 2, 3, 4, 6], 1 = [5]}

 

그 후 map을 순회하며 그룹의 크기만큼 사람들을 result 리스트에 담아주면 됩니다.

List<List<Integer>> result = new ArrayList<>();
for (Map.Entry<Integer, List<Integer>> entry : map.entrySet()) {
    int size = entry.getKey();
    List<Integer> people = entry.getValue();
    
    // 해당 그룹 크기만큼의 사람들을 그룹으로 나누기
    for (int i = 0; i < people.size(); i += size) {
        result.add(people.subList(i, i + size));
    }
}

 

 

크기가 3인 곳에 세 명씩, 크기가 1인 곳에 한 명을 넣으면 다음과 같이 result 리스트가 완성되겠죠?

result = [[0, 1, 2], [3, 4, 6], [5]]

 

 

코드입니다.

import java.util.*;

class Solution {
    public List<List<Integer>> groupThePeople(int[] groupSizes) {
         // 그룹 크기별로 사람들을 분류할 해시맵
        HashMap<Integer, List<Integer>> map = new HashMap<>();
        
        // 그룹 크기별로 사람들을 해시맵에 추가
        for (int i = 0; i < groupSizes.length; i++) {
            int size = groupSizes[i];
            if (!map.containsKey(size)) {
                map.put(size, new ArrayList<>());
            }
            map.get(size).add(i);
        }
        
        // 결과를 저장할 리스트
        List<List<Integer>> result = new ArrayList<>();
        
        // 해시맵을 순회하며 그룹 완성
        for (Map.Entry<Integer, List<Integer>> entry : map.entrySet()) {
            int size = entry.getKey();
            List<Integer> people = entry.getValue();
            
            // 해당 그룹 크기만큼의 사람들을 그룹으로 나눔
            for (int i = 0; i < people.size(); i += size) {
                result.add(people.subList(i, i + size));
            }
        }
        return result;
    }
}

 

배운 점

영어가 안되는건지, 번역이 매끄럽지 않은건지 아직 leetcode의 문제는 요구사항을 이해하는데 일단 30분은 소요되는 것 같습니다. 요즘 아무리 훌륭한 변역툴이 많다고 해도 간단한 원문은 그대로 해석하는 능력을 갖춰야 할 것 같습니다.

 

일도 해야하고, 자격증 취득도 해야하고, 이직을 위한 코딩 테스트도 준비해야 하고, 대학 공부도 해야하고, 여기에 독해를 위한 영어까지 공부를 해야 하는데 사실 시간을 어떻게 나누고 어떤 방식으로 준비를 해나가야 할 지 막막합니다. 할 일은 많아지는데 시간은 한정적이니 언제 한 번 우선도를 나누어 꾸준히 평생 한다는 생각으로 해야 하는 일들과 단기적으로 최대한 집중해서 처리해야 하는 일을 구분할 필요성을 느낍니다.

 

 

오늘의 한줄평

자산도 복리의 마법이 있듯 지식 또한 복리의 마법이 있다.