[프로그래머스]

프로그래머스 혼자 놀기의 달인 C++

Hevton 2023. 9. 17. 08:51
반응형

 

불과 며칠 전에 문제를 읽다가 이해가 안되어서 끝까지 읽지도 못하고 즈레 겁먹어 그만뒀던 문제다.

마치 보드게임장에 가서 설명을 잘 이해하느냐의 차이인 것 같다.

책을 읽는 것도 도움이 많이 되는 듯 하다.

 

집중력이 필요하고, 겁먹지 않는 점이 중요하다.

이 문제는 쓸데없는 얘기가 주구장창 이어지다가, 결국 출력예시만 봐도 문제를 풀 수 있다.

 

 

문제 정리

그냥 group화 dfs 문제이다.

그룹이 하나밖에 없으면 0을 리턴하면 되고

그룹이 두 개 이상이라면, 그룹 인원이 가장 많은 두 그룹을 곱해 주기만 하면 된다.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int group[101];
int groupCounter = 0;

void dfs(vector<int>& cards, int index, int groupId) {
    
    groupCounter++;
    group[index] = groupId;
    
    if(group[cards[index] - 1] == 0) {
        dfs(cards, cards[index] - 1, groupId);
    }
}

int solution(vector<int> cards) {
    
    int groupId = 0;
    
    vector<int> groupList;
    
    for(int i = 0; i < cards.size(); i++) {
        
        if(group[i] == 0) {
            groupCounter = 0;
            dfs(cards, i, ++groupId);
            groupList.push_back(groupCounter);
        }
        
    }
    
    sort(groupList.begin(), groupList.end(), greater<int>());
    
    if(groupId == 1)
        return 0;
    else
        return groupList[0] * groupList[1];
    
}

 

반응형