[Level 2 / 해시] 위장 + Swift

sanghee·2021년 8월 30일
1

🙈코딩테스트

목록 보기
10/52
post-thumbnail

위장

코딩테스트 연습 - 위장

나의 풀이

딕셔너리 형태로 옷의 개수를 구하였다. 그 후 개수의 1씩 더한 값을 곱한 후 아무것도 없는 경우인 1을 빼 정답을 구했다. 딕셔너리인 clothDic는 아래와 같은 형태이다.

func solution(_ clothes:[[String]]) -> Int {
    var clothDic : [String: Int] = [:]
    
    for cloth in clothes {
        if clothDic[cloth[1]] != nil {
            clothDic[cloth[1]]! += 1
        } else {
            clothDic[cloth[1]] = 1
        }
    }
    
    return clothDic.values.reduce(1) { ($0) * ($1 + 1) } - 1
}
clothDic = ["eyewear": 1, "headgear": 2]

다른사람의 풀이

다른 사람의 풀이를 참고하여 작성하였다. 내가 딕셔너리로 했던 것과는 반대로, 타입에 대한 배열과, 그 배열로 개수 배열을 따로 구해서 reduce로 답을 도출하였다.

func solution(_ clothes:[[String]]) -> Int {
    let typeSet = Set(clothes.compactMap({ $0[1] }))
    
    let counts = typeSet.map({ type in
        return clothes.filter({ $0[1] == type }).count
    })
    
    return counts.reduce(1, {$0 * ($1 + 1)} ) - 1
}

map과 compactMap의 차이

compactMap은 1차원 배열인 경우 nil을 제거한다. 추가로 compactMaps는 flatMap과는 다르게 2차원 배열을 1차원 배열로 flatten하게 만들지 않는다.

let arr = [1, 2, nil, 4]

let mapArr = arr.map({ $0 }) // [Optional(1), Optional(2), nil, Optional(4)]

let compactMapArr = arr.compactMap({ $0 }) // [1, 2, 4]
profile
👩‍💻

0개의 댓글