CodingTest/99클럽2024스터디

99클럽 코테 스터디 25일차 TIL, 프로그래머스 / 순위

mrawesome 2024. 8. 15. 22:41

https://school.programmers.co.kr/learn/courses/30/lessons/49191?language=cpp#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>
#include <set>
#include <iostream>

using namespace std;

int N;
vector<vector<int>> wins;
vector<vector<int>> loses;
vector<int> answers;
vector<bool> visit;

void dfs(bool win, set<int>& acc, int curN)
{
    visit[curN] = true;
    
    if (win)
    {
        // curN '가' 이긴 애들
        for (int w : wins[curN])
        {
            if (visit[w]) continue;
            acc.insert(w);
            dfs(win, acc, w);
        }
    }
    else
    {
        // curN '을' 이긴 애들
        for (int l : loses[curN])
        {
            if (visit[l]) continue;
            acc.insert(l);
            dfs(win, acc, l);
        }
    }
}

int solution(int n, vector<vector<int>> results) {
    int answer = 0;
    vector<int> fixed;

    N = n;
    visit.resize(n + 1);
    wins.resize(n + 1, vector<int>());
    loses.resize(n + 1, vector<int>());
    
    for (const vector<int>& result : results)
    {
        int win = result[0];
        int lose = result[1];
        wins[win].push_back(lose);
        loses[lose].push_back(win);
    }
    
    for (int i = 1; i < n + 1; ++i)
    {
        for (int s = 0; s < n + 1; ++s) visit[s] = false;
        set<int> acc;
        acc.insert(i);
        dfs(true, acc, i);
        dfs(false, acc, i);
        
        if (acc.size() == n)
            answer += 1;
    }
    
    // 일단 dfs 로 풀면서, 이긴 애들이 총 몇명인지를 다 구해본다
    // ex) 4 -> 3,2,5 (총 3명)
    // ex) 3 -> 2,5 (2명)
    // ex) 2 -> 5(1명)
    // ex) 1 -> 2(1명)
    // 아니면 모두 일렬로 세워보나 ?
    // 아니면 win, lose 모두 dfs 돌려봐서, 5개면 되는 거 아닌가 ?
    // () 4 (3 2 5)
    // (4) 3 (2 5)
    // (4, 3, 1) 2 (5)
    // (1 4 3 2) 5 -
    
    // 1 (2,3,4)
    // (1) 2 (3)
    // (2) 3
    // (1) 4
    
    return answer;
}