[Swift] [69일차] 2610_LEET 2차원변형배열

·2025년 2월 14일
0

SwiftAlgorithm

목록 보기
72/105

2610. Convert an Array Into a 2D Array With Conditions


문제 설명

  1. 일반적인 Int 배열이 주어짐
  2. 겹치지않게 해당 1차원 배열을 2차원배열로 치환해서 row 마다 겹치지않게 나누어라
  3. 2차원 배열의 row수는 최소로 만들기

문제 풀이

  1. [1,3,4,1,2,3,1]이런식으로 주어지는 배열에 이제 종류를 SET써서 파악할 것이다.
  2. 그러면 이걸 어떻게 분류를 할 것이냐..에 대해서는 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로 동시에 해준것을 볼 수 있다. 나머지는 비슷한듯 !

profile
기억보단 기록을

0개의 댓글