Make Unreal REAL.
article thumbnail
Level 2. 혼자 놀기의 달인

 

 

유니온-파인드의 Find를 응용해 해결할 수 있다.

  • 상자를 열어 숫자를 확인해가는 과정이 유니온-파인드에서 대표 번호를 찾는 과정과 같기 때문이다.

 

Find 과정에서 현재 집합에 속하는 숫자의 개수를 갱신하고, 다음 대표 번호를 찾기 전에 내 대표 번호를 자신으로 설정해주면 된다.

 

모든 수들이 하나의 집합에 속할 경우는, 두 번째 집합의 크기가 0임에 주의해야 한다.

 

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

int findRep(vector<int>& rep, int i, int& depth)
{
    if (rep[i] == i)
    {
        depth = max(1, depth);

        return i;
    }

    ++depth;

    int next = rep[i];
    rep[i] = i;

    return rep[i] = findRep(rep, next, depth);
}

int solution(vector<int> cards)
{
    size_t n = cards.size() + 1;
    vector<int> rep(n, 0), numbers;
    unordered_map<int, bool> group;

    copy(cards.begin(), cards.end(), rep.begin() + 1);

    for (int i = 1; i < n; ++i)
    {
        if (group[rep[i]] == false)
        {
            int nNum = 0;

            group[findRep(rep, i, nNum)] = true;
            numbers.emplace_back(nNum);
        }
    }

    sort(numbers.rbegin(), numbers.rend());

    return (numbers.size() <= 1) ? 0 : numbers[0] * numbers[1];
}

'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글

Level 2. 광물 캐기  (0) 2023.09.02
Level 2. 혼자서 하는 틱택토  (0) 2023.09.01
Level 2. 3 x n 타일링  (0) 2023.08.30
Level 2. 과제 진행하기  (0) 2023.08.29
Level 3. 파괴되지 않은 건물  (0) 2023.08.28
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그