티스토리 뷰

728x90
반응형

문제 요약

문제풀이 

 이번 문제는 Hash와 리스트를 활용 하면되는 간단한 문제 이다. 구현은 아래와 같이 하면된다.

  1. 결과에 담을 2차원 리스트와 Hash에 저장할 변수를 선언한다. Hash의 key-value는 groupSize- 인덱스 담을 리스트로 구성한다.
  2. groupSize 크기 만큼 반복문을 돌린다.
  3. i번째에서 Hash key값이 없을 경우 추가하고 그 key값 리스트에 추가한다.
  4. 추가한후 key값의 리스트 크기와 i번째 size와 같을때 결과 리스트에 추가하고 key의 리스트는 초기화 한다.

 위와 같이 구현은 하면 시간 복잡도는 O(N^2)만큼 나올것이다. Hash활용만 하면 문제는 쉽게 풀수 있을 것이다.

Code

Python

  • defaultdict은 일반 dictionaly다르게 초기값을 지정하면 없을때 지정값 초기값으로 반환 한다. 그러면 없을경우 NullExeption 오류가 안난다.
  • deepCopy는 그냥 저장하고 초기화면 result에 안에 있는 값 같이 초기화 하기 때문에 이와 같은 현상을 방지 하기 위해서 deepcopy를 사용한다.
from collections import defaultdict
from copy import deepcopy

class Solution:
    def groupThePeople(self, groupSizes: List[int]) -> List[List[int]]:
        result = [] # 결과에 담을 변수
        length = len(groupSizes)
        map = defaultdict(list)

        for i in range(length):
            size = groupSizes[i]
            # map에 키값이 없을 경우 새로 추가 한다.
            if size not in map.keys():
                map[size] = []

            map[size].append(i)
            
            # map value와 size와 같을 경우 결과 리스트에 추가하고 value 리스트를 초기화 한다.
            if len(map[size]) == size:
                result.append(deepcopy(map[size]))
                map[size].clear()

        return result

Java

  1. result.add(new ArrayList<>(map.get(size))): 그냥 리스트를 저장하지 않고 new로 선언해서 저장한 이유는 Java의 Call By 개념 때문이다. 그냥 저장 할 경우 같은 주소 값을 가진 리스트를 저장 한다. 그러면 clear 사용 할 경우 결과에 저장한 리스트도 같이 초기화 한다. 이 와 같은 현상을 방지 하기 위해서 새 인스트턴스에 담아서 저장하면 clear 해도 영향을 가지 않는다.
import java.util.*;

class Solution {
    public List<List<Integer>> groupThePeople(int[] groupSizes) {
        List<List<Integer>> result = new ArrayList<>(); // 결과
        int length  = groupSizes.length;
        Map<Integer, List<Integer>> map = new HashMap<>(); // map

        int size;
        for(int i = 0; i < length; i++){
            size = groupSizes[i];
            // Map에 없을 경우 리스트 추가
            if(!map.containsKey(size)){
                map.put(size, new ArrayList<>());
            }

            map.get(size).add(i);

            // Group Size와 리스트 길이 같을때 Result에 저장
            if(map.get(size).size() == size){
                result.add(new ArrayList<>(map.get(size)));
                map.get(size).clear();
            }
        }

        return result;
    }
}
728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함