2610. Convert an Array Into a 2D Array With Conditions
문제 설명
- 일반적인 Int 배열이 주어짐
- 겹치지않게 해당 1차원 배열을 2차원배열로 치환해서
row
마다 겹치지않게 나누어라- 2차원 배열의 row수는 최소로 만들기
문제 풀이
[1,3,4,1,2,3,1]
이런식으로 주어지는 배열에 이제 종류를SET
써서 파악할 것이다.- 그러면 이걸 어떻게 분류를 할 것이냐..에 대해서는
dictionary
구조를 착안했다.var dict = [Int: Int]() for num in nums { dict[num, default: 0] += 1 }
이렇게 하고나면 딕셔너리에 각 원소 개수만큼이 기록되는데,
var maxi = 0 for i in dict.values { maxi = max(maxi, i) }
이렇게해서 최대 몇층으로 구성할지를 정해주고, (가장 많은 빈도수가 곧 층을 의미)
for row in 0 ..< maxi { var tmp = [Int]() for element in set { dict[element]! -= 1 tmp.append(element) if dict[element]! < 1 { set.remove(element) } } answer[row] = tmp }
이렇게
SET
에서 빼내면서,-=1
씩 해주면 이제 한층마다 원하는걸 뺄 수 있는 것이다.
그렇게 차근차근히-=1
카운팅해주면서 빼면은 이제 완성
최종코드
class Solution {
func findMatrix(_ nums: [Int]) -> [[Int]] {
var dict = [Int: Int]()
var set = Set(nums)
for num in nums {
dict[num, default: 0] += 1
}
var maxi = 0
for i in dict.values {
maxi = max(maxi, i)
}
var answer = Array(repeating: [Int](), count: maxi)
for row in 0 ..< maxi {
var tmp = [Int]()
for element in set {
dict[element]! -= 1
tmp.append(element)
if dict[element]! < 1 {
set.remove(element)
}
}
answer[row] = tmp
}
return answer
}
}
타인의 코드
class Solution {
var twoDArray: [[Int]] = [[]]
func findMatrix(_ nums: [Int]) -> [[Int]] {
let maxFrequency = nums.reduce(into: [Int: Int]()) { counts, num in
counts[num, default: 0] += 1
}.values.max() ?? 1
var twoDArray = Array(repeating: [Int](), count: maxFrequency)
for number in nums {
var found = false
for i in 0..<twoDArray.count {
if !twoDArray[i].contains(number) {
twoDArray[i].append(number)
found = true
break
}
}
if found { continue }
}
return twoDArray
}
}
contains
사용했고, max값해주는걸 reduce로 동시에 해준것을 볼 수 있다. 나머지는 비슷한듯 !