본문 바로가기
알고리즘/문제풀이

[프로그래머스] (Swift) 위장

by venniek 2022. 10. 5.

문제 보러 가기

문제

스파이들이 여러 종류의 옷들을 겹치지 않게 입으려고 한다.

각 종류당 하나의 옷을 입을 수 있고 입지 않는 종류가 있어도 괜찮다. 하지만 최소 한 개의 종류는 입어야 한다.

해결

Dictionary 만들기

의상 이름, 종류 순으로 String 배열이 들어오는데 총 조합의 개수만 알아내면 되므로 이름은 신경쓰지 않아도 된다. 같은 종류에 새로운 이름이 들어올 때마다 value+1 해준다.

  • Dictionary에 종류를 key, 개수를 value로 저장해준다.

경우의 수 구하기

어떤 수의 약수의 개수는 소인수분해 후 각 밑의 지수 + 1끼리의 곱으로 구할 수 있다. 각 밑을 0번, 1번, 2번, … n번 사용해 수를 만들 수 있기 때문이다. 같은 원리를 사용한다.

한 종류 안에서 n개의 이름이 들어왔다면 안 입기, 1번 이름 입기, 2번 이름 입기, … n번 이름 입기 라고 생각하면 한 종류당 n + 1개의 경우의 수가 생긴다.

Dictionary 에서 value + 1 끼리의 곱을 구한다. 이때 모든 종류를 안 입는 경우는 빼줘야 한다.

  • Dictionary 를 순회하면서 value + 1을 곱한 후 1을 빼준다.
  • value.value로 접근할 수 있다.

코드

import Foundation

func solution(_ clothes:[[String]]) -> Int {
    var dict = [String: Int]()
    var ans = 1  // 곱할 거니까 0이 아닌 1부터 시작

    for str in clothes {
        if let cnt = dict[str[1]] {
            dict[str[1]] = cnt + 1
        } else {
            dict[str[1]] = 1
        } // 한 줄로 쓸 수 있을 거 같은데 모르겠다ㅠㅠ
    }
    for i in dict {
        ans *= i.value + 1
    }

    return ans - 1
}

'알고리즘 > 문제풀이' 카테고리의 다른 글

[프로그래머스] (Swift) 순위  (2) 2022.11.16
[LeetCode] (Swift) 13. Roman to Integer  (0) 2022.09.14
[백준] (Swift) 2675 문자열 반복  (0) 2022.07.11
[백준](Swift) 1차원 배열  (0) 2022.06.04
[백준](Swift) 반복문  (0) 2022.05.28

댓글