[swift]프로그래머스_의상

Jeff·2일 전
1

# 문제 : 의상

문제에서 요구하는건 각 카테고리별 옷을 겹치지않게 입을 수 있는 경우의 수를 구하는거라고 생각한다. 입출력 예에서 보듯 이중 배열로 각각 의상의 이름과 카테고리를 받아온다.

# 풀이과정

우선 문제의 키워드에서 힌트를 얻을 수 있었다. 해시를 활용해 문제에 접근해서 풀면 된다.

Hash(해시) : 데이터를 고유하게 식별하기 위해 고정된 길이의 값(해시값)을 생성하는 과정으로 Swift에서는 주로 컬렉션 타입(Set, Dictionary)에서 객체를 비교하거나, 데이터를 빠르게 검색하고 저장하기 위해 사용한다.

그렇다. 우리는 해시테이블 구조로 된 딕셔너리를 이용하면 된다.
그럼 데이터를 그룹화하기 위해 딕셔너리를 활용해 데이터를 그룹화를 하였다.

	var categoryGroups: [String: [String]] = [:]
	for cloth in clothes {
    let name = cloth[0]
    let category = cloth[1]
    categoryGroups[category, default: []].append(name)
} 
  • 빈 딕셔너리 Key, value배열을 생성했다.
  • 입력받은 clothes를 순회하면서 key값과 value값을 딕셔너리에 추가했다.
  • default 키워드는 만약에 값이 없는 키값이라면 빈배열을 기본값으로 제공한다는걸 의미로 안전하게 작업을 할 수 있게한다.

key : 의류 카테고리
value : 각 카테고리에 소속된 의상들(배열로 구성)

이렇게 딕셔너리의 key값은 자동적으로 해시값을 계산해서 저장하고 있는다.
그렇기에 데이터 검색 속도가 빠르게 할 수 있고 동일한 해시값이 생겨도 내부적으로 처리하게 된다.

for i in categoryGroups.keys {
    var value = 0
    value = categoryGroups[i]!.count + 1
    result *= value
}

다음은 입을 수 있는 의상의 수를 연산하는 부분이다. 우선 앞서 데이터를 저장한 카테고리그룹의 key의 값들을 순회돌면서 각 key값에 해당하는 배열의 갯수를 구하는 코드이다.

  • 여기서 나온 계산은 예시를 들어보면 상의라는 카테고리에서 3개의 의류가 있다면, 선택하지 않는 경우를 포함해 (3 + 1) 가지 조합이 나오게 된다.
  • 최종 결과는 (카테고리1 조합) * (카테고리2 조합) ... * (카테고리n 조합) - 1 (아무것도 입지 않는 경우를 제외)를 계산한다.

# 전체 코드

아직도 내가 푼 방식이 잘 맞는지 모르겠다. 다른 분들의 풀이를 보면 많이 다르고 배울점이 많이 있었다.
profile
기본에 충실한 개발자가 목표!

0개의 댓글