땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • I
  • ㅗ
  • 이것이 리눅스다 with Rocky Linux9
  • D
  • E

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원
Algorithm/Algorithm Problem

백준 10451 순열 사이클(DFS, Union-Find)

Algorithm/Algorithm Problem

백준 10451 순열 사이클(DFS, Union-Find)

2022. 6. 27. 17:26

https://www.acmicpc.net/problem/10451

 

10451번: 순열 사이클

1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러 가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 \(\begin{pmatrix} 1 & 2 &3&4&5&6&7&8 \\  3

www.acmicpc.net

주어진 순열에 대해서 그래프를 만들고 그 그래프(사이클)이 몇개 있는지 파악하는 문제이다.

문제를 읽고 dfs,bfs나 union-find로 풀 수 있을 것 같다는 생각을 하여 풀었다.

 

union-find로 풀면서 헷갈리는 부분이 있었는데 이 알고리즘을 정확히 알아야한다.

union은 단순히 합치기, find는 부모노드를 찾는게 아닌 root노드를 찾는 것

 

즉, union을 한다음에 find을 해줘야 정확한 root노드를 찾는 것

단순히 union을 한다음 parent list로 판단해서는 잘못된 생각이다.

 

<DFS>

def dfs(v):
    if visited[v]:
        return 0
    visited[v] = 1
    for i in graph[v]:
        if not visited[i]:
            dfs(i)
    return 1

for _ in range(int(input())):
    n = int(input())
    data = list(map(int,input().split()))
    std = range(1,n+1)
    graph = [[] for _ in range(n+1)]
    visited = [0] * (n+1)

    cnt = 0
    for i in range(n):
        graph[std[i]].append(data[i])

    for i in range(1,n+1):
        cnt += dfs(i)
    print(cnt)

<Union-Find>

def find(target):
    if parent[target] != target:
        parent[target] = find(parent[target])
    return parent[target]

def union(a, b):
    global ans
    a = find(a)
    b = find(b)
    if a < b:
        parent[b] = a
    elif a > b:
        parent[a] = b


for _ in range(int(input())):
    n = int(input())
    data = list(map(int,input().split()))
    parent = list(range(n+1))
    res = []

    for i in range(n):
        union(i+1,data[i])

    for i in range(n+1):
        res.append(find(i))
    print(len(list(set(res[1:]))))

 

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 2251 물통(BFS)  (0) 2022.07.03
백준 6236 용돈 관리(이분 탐색)  (0) 2022.07.03
백준 1326 폴짝폴짝(BFS)  (0) 2022.06.26
백준 16112 5차 전직(그리디)  (0) 2022.06.26
백준 9421 소수상근수(소수)  (0) 2022.06.26
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 2251 물통(BFS)
    • 백준 6236 용돈 관리(이분 탐색)
    • 백준 1326 폴짝폴짝(BFS)
    • 백준 16112 5차 전직(그리디)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.