Programming/Baekjoon

백준 10451 c++ 순열사이클

fishersheep 2022. 3. 10. 13:55
반응형
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>

using namespace std;

int t;
int n;
int temp;
vector<int>vec[1005];
vector<int>result;
bool visited[1005];
int sum = 0;

void dfs(int start) //dfs 탐색
{
    stack<int>s;
    s.push(start);
    visited[start] = true;

    while (!s.empty())
    {
        int x = s.top();
        s.pop();

        for (int i = 0; i < vec[x].size(); i++) //스택의 top 값인 x와 연결된 값들을 확인
        {   
            if (visited[vec[x][i]])continue;    //방문하지않았으면 스택의 push하여 같은 사이클로 생각

            s.push(vec[x][i]);
            visited[vec[x][i]] = true;
        }

    }

    sum += 1;   //사이클 개수 증가
}


int main()
{
    ios::sync_with_stdio(false);
    cout.tie(NULL);
    cin.tie(NULL);
    
    cin >> t;   //테스트케이스 개수 입력

    for (int i = 0; i < t; i++)
    {
        cin >> n;   //순열의 크기 입력

        for (int i = 1; i <= n; i++)    //순열을 저장하는 배열 초기화
            vec[i].clear();
        
        fill(visited, visited + 1001, false);   //방문을확인하는 배열 초기화
        
        for (int j = 1; j <= n; j++)
        {
            cin >> temp;    //순열 입력
            vec[j].push_back(temp);  //1 2 3 4 5 6 7 8 9 10 <- 저장되는 값 예제
            vec[temp].push_back(j);  //2 1 3 4 5 6 7 9 10 8

            if (temp == j)  //같은 숫자인 경우 사이클 개수 증가 및 방문표시
            {
                visited[temp] = true;
                sum++;
            }
        }

        for (int k = 1; k <= n; k++)
        {   
            if(!visited[k]) //방문하지 않은 값 방문
                dfs(k);
        }

        result.push_back(sum);  //결과값 result 벡터에 저장
        sum = 0;
        
    }

    for (int i = 0; i < result.size(); i++) //결과값 출력
        cout << result[i] << '\n';

    return 0;
}

 

후기

테스트케이스와 출력이 같았지만 계속 9%에서 틀렸다고해서 시간이 약간걸렸다. 천천히 다시보던중 순열을 저장하는 vector가 제대로 초기화되지않았다는 것을 확인하고 수정한 후 제출하니 정답이였다.

반응형

'Programming > Baekjoon' 카테고리의 다른 글

백준 14888 연산자 끼워넣기 [c++]  (0) 2022.03.15
백준 11724 c++ 연결 요소의 개수  (0) 2022.03.10
백준 1753 c++ 최단경로  (0) 2022.03.09
백준 1094번 c++ 막대기  (0) 2022.03.09
백준 8958 OX퀴즈 [c++]  (0) 2022.03.08