1282. Group the People Given the Group Size They Belong To
문제 설명
groupSizes
라는 배열이 주어지는데, groupSizes[i]가 이제 i번째 사람이 groupSizes[i]값에 해당하는 그룹에 묶여야한다는 것- 그렇게해서 [3,3,3,3,3,1,3]이면 i = 5 를 제외한 나머지사람들은 3명씩 묶여야하는 것
- 그렇게 묶은 애들끼리의 인덱스 배열 return하라
문제 풀이
- 일단 값보다 인덱스가 중요한 거라고 생각해서 index위주로 반복문을 돌려줬다.
- 그리고 이미 포함된 친구는 걸러줘야하기때문에 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 }
앞으로 이게 인덱스 기억해야해서 억지로 주어진 배열에서 처리해주는 것이 아니라 경우에 따라서는 이렇게 튜플로 인덱스랑 같이 묶어줘서 하는 해결방식도 있다는 것을 기억!