[Swift] [83일차] 1282_LEETCODE 그룹핑

·2025년 3월 1일
0

SwiftAlgorithm

목록 보기
87/105
post-thumbnail

1282. Group the People Given the Group Size They Belong To


문제 설명

  1. groupSizes라는 배열이 주어지는데, groupSizes[i]가 이제 i번째 사람이 groupSizes[i]값에 해당하는 그룹에 묶여야한다는 것
  2. 그렇게해서 [3,3,3,3,3,1,3]이면 i = 5 를 제외한 나머지사람들은 3명씩 묶여야하는 것
  3. 그렇게 묶은 애들끼리의 인덱스 배열 return하라

문제 풀이

  1. 일단 값보다 인덱스가 중요한 거라고 생각해서 index위주로 반복문을 돌려줬다.
  2. 그리고 이미 포함된 친구는 걸러줘야하기때문에 SET을 만들고 contains로 이미 포함이 되었지를 판단해주면서 이중반복문으로 처리를 해줬다.
class Solution {
    func groupThePeople(_ groupSizes: [Int]) -> [[Int]] {
        var answer = [[Int]]()
        var alreadyGrouped = Set<Int>()

        for (idx, value) in groupSizes.enumerated() {
            var tmp = [Int]()
            if !alreadyGrouped.contains(idx) { // 포함되지 않은것
                tmp.append(idx)
                alreadyGrouped.insert(idx)
                for (i, v) in groupSizes.enumerated() {
                    if idx == i {
                        continue
                    }
                    if groupSizes[i] == value, !alreadyGrouped.contains(i), tmp.count < value {
                        alreadyGrouped.insert(i)
                        tmp.append(i)
                    }
                }
                answer.append(tmp)
            }
        }

        return answer
    }
}

최종 제출 코드

class Solution {
    func groupThePeople(_ groupSizes: [Int]) -> [[Int]] {
        var answer = [[Int]]()
        var alreadyGrouped = Set<Int>()

        for (idx, value) in groupSizes.enumerated() {
            var tmp = [Int]()
            if !alreadyGrouped.contains(idx) { // 포함되지 않은것
                tmp.append(idx)
                alreadyGrouped.insert(idx)
                for (i, v) in groupSizes.enumerated() {
                    if groupSizes[i] == value, !alreadyGrouped.contains(i), tmp.count < value {
                        alreadyGrouped.insert(i)
                        tmp.append(i)
                    }
                }
                answer.append(tmp)
            }
        }

        return answer
    }
}

타인의 코드

class Solution {
    func groupThePeople(_ groupSizes: [Int]) -> [[Int]] {
        let values: [(Int, Int)] = groupSizes.enumerated().sorted { $0.element < $1.element }

        var result: [[Int]] = []
        var i = 0
        while i < values.count {
            let size = values[i].1
            let group: [Int] = values[i..<i + size].map { $0.0 }
            result.append(group)

            i += size
        }

        return result

    }
}

인덱스랑 값을 같이 묶은 튜플을 생각을 안한건 아닌데, 좀 번거로울 것이라고 생각을 했었다. 근데 이걸

 let values: [(Int, Int)] = groupSizes.enumerated().sorted { $0.element < $1.element }

이렇게 한줄로 처리를 해준 것은 좀 신기했다. [3,3,3,3,3,1,3]이 들어가면 [(5, 1), (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (6, 3)] 이렇게 값이 나오게 된다.
그리고 이게 sorting을 해줬는데도 튜플이라서 인덱스가 저장이 되어있으니까 이걸 그냥
i...i+size로 처리르 해주면 바로 나오는 것이었다.

let group: [Int] = values[i..<i + size].map { $0.0 }

앞으로 이게 인덱스 기억해야해서 억지로 주어진 배열에서 처리해주는 것이 아니라 경우에 따라서는 이렇게 튜플로 인덱스랑 같이 묶어줘서 하는 해결방식도 있다는 것을 기억!

profile
기억보단 기록을

0개의 댓글