Taehyeon-Kim/SwiftAlgorithm

[PG] 해시 > 위장

Closed this issue · 2 comments

  • 위장(Lv2)

위장(Lv2)

느낀 점

  • 아이디어 얻는 것은 어렵지 않았다.
    • 경우의 수 개념(수학적 지식)을 알고 있었다면 그리 어렵지 않게 포인트를 잡아낼 수 있다.
    • (카테고리1 + 1)...(카테고리N + 1) - 1
      • 카테고리 (headgear, eyewear ...)
    • 필요한 부분은 카테고리에 해당하는 의상의 갯수였다.
  • 아이디어를 바탕으로 적절한 자료구조를 생각해보면 그냥 Dictionary가 떠올랐다.
    • 의상의 카테고리가 key가 되고, 의상이 value가 되는 구조로 보고 로직을 작성하면 되었다.
  • 카테고리만 얻어내기 위해서 map을 이용해보려고 했다.
    • 코드가 한결 가벼워지긴 했지만, 여전히 반복문을 돌아야하기 때문에 작성하다만 느낌이었다.
    • 다른 참고코드를 보니 compactMap을 이용할 수 있더라.

얻어갈 점, 개선할 점

  • compactMap을 사용해보자.

위장(Lv2) 코드 개선 및 학습

  • 다른 사람 풀이 학습
  • 진짜 고차함수를 적용해보는데 가장 기초적인 문제인 것 같아서 좋았다.
    • 세상에는 고수가 많다..
  • 원 데이터를 계속 수정하는 방식으로 생각했는데, 최대한 안 건드리고 데이터를 비교하는 식으로 접근하는 것도 좋을 것 같다.
import Foundation

func solution(_ clothes:[[String]]) -> Int {
    
    let types = clothes.compactMap { $0.last }
    let categories = Set(types)
    
    let counts = categories.map({ category in
        return clothes.filter({ $0.last == category }).count + 1
    })

    return counts.reduce(1, { $0 * $1 }) - 1
}
  • last 프로퍼티 이용해서 마지막 요소 반환
  • compactMap 이용한 optional 제거한 배열 반환
  • Set 이용한 중복 제거
  • map 안에서 다른 Collection 반환
  • reduce 이용해서 요소 차례대로 곱셈