정리와기록 블로그

[위장] 본문

프로그래머스

[위장]

뫂림 2020. 9. 13. 21:02

문제 : programmers.co.kr/learn/courses/30/lessons/42578#

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

초기 접근:

  • 중복되는 옷이 한 개도 없기 때문에, 경우의 수로 풀면 될 것 같다는 느낌을 받았습니다.
  • 초기 접근은 선택하고, 안하고를 반복하여 전체 부분 집합을 만든 다음, answer를 부분 집합의 곱으로 구해주었습니다.
  • 해당 접근으로 풀었을 때, 케이스1에서 오답이 발생했고 극단적인 경우를 생각해보았을 때, 2^30 - 1 > 10억이므로 안된다는 것을 알게 되었습니다.

실패 코드(일부):

void PickSum(const int& n, int i, int subSum)
{
    if (i == n) // 0부터 시작
    {       
        answer += subSum;
        return;
    }

    PickSum(n, i + 1, subSum * typeCounter[types[i]]);
    PickSum(n, i + 1, subSum);
}

 

개선된 접근:

  • 블로깅을 통해 힌트를 얻었습니다. 경우의 수를 활용한 수학에 가까운 문제임을 알게 되었습니다.
  • 입을 수 있는 옷의 종류가 A, B, C 세 가지이고, 각각의 옷의 개수 또한 세 개라고 하면 A의 경우 '안 입는다'까지 포함하여 총 4가지 경우가 있습니다. 옷의 종류마다 이 논리가 적용되므로 위 예에서는 4 * 4 * 4 - 1(모두 안입는다)에 해당합니다.
  • 시간복잡도 및 이산적인 수학?에 능해야 겠다고 생각했습니다.

 

코드:

#include <string>
#include <vector>
#include <map>

using namespace std;

map<string, int> typeCounter;

int solution(vector<vector<string>> clothes) 
{ 
    int answer = 1;
    for (auto& v : clothes)
    {
        typeCounter[v[1]]++;
    }

    for (auto& t : typeCounter)
    {
        answer *= t.second + 1;
    }

    return answer - 1; // 빈 집합 1개 제거
}

'프로그래머스' 카테고리의 다른 글

[프린터]  (0) 2020.09.26
[베스트앨범]  (0) 2020.09.25
[가장 큰 수]  (0) 2020.09.05
[주식가격]  (0) 2020.09.05
[기능개발]  (0) 2020.09.02
Comments