백준_순열 사이클

임정민·2024년 1월 20일
0

알고리즘 문제풀이

목록 보기
147/173
post-thumbnail

백준 실버3 DFS 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 26분


import sys
sys.setrecursionlimit(2000)

def dfs(k,nums,visitied,ans):
    if not visitied[k]:
        visitied[k]=True
        dfs(nums[k]-1,nums,visitied,ans)

    return 1


T = int(input())

for i in range(T):

    N = int(input())
    nums = list(map(int,input().split()))
    visitied = [False for j in range(N)]
    ans = 0
    
    for k in range(len(nums)):
        if not visitied[k]:
            ans += 1
        dfs(k,nums,visitied,ans)
    print(ans)

1부터 N까지의 정수 순열이 주어지고 인덱스-값 끼리 연결되는 것을 사이클이라고 정의했을 때, 입력되는 순열별 사이클의 갯수를 구하는 문제입니다.🐇🐇🐇

인덱스를 돌며 인덱스에 해당하는 값을 다시 해당하는 인덱스로 탐색하는 문제이므로 DFS(재귀함수)로 구현하여 해결할 수 있었습니다.

[다른 사람의 풀이1]


def dfs(v):
  visited[v] = True  # 현재노드 방문처리
  nv = graph[v]      # 인접 노드
  # 아직 방문하지 않은 노드라면 dfs 호출
  if not visited[nv]:
    dfs(nv)
  
for _ in range(t):
  n = int(input())  # 순열 크기
  graph = list(map(int, input().split()))  # 순열(n개)
  graph.insert(0, 0)  
  visited = [False] * (n + 1)  # 1 ~ n 사용
  cycle = 0  # 순열 사이클 개수

  for i in range(1, n + 1):
    # 방문하지 않은 노드라면
    if not visited[i]:
      dfs(i)      # i노드에서 dfs 호출
      cycle += 1  # 사이클 개수 1증가
  print(cycle)

'나의 풀이'와 같이 DFS, 재귀함수를 활용한 풀이입니다.🐤🐤🐤

[다른 사람의 풀이2]


from collections import deque
t = int(input())  # 테스트 케이스 수

# BFS
def bfs(v):
  queue = deque()
  # 시작 노드 삽입, 방문 처리
  queue.append(v)
  visited[v] = True

  while queue:
    v = queue.popleft()
    nv = graph[v]
    # 방문하지 않는 노드라면
    if not visited[nv]:
      queue.append(nv)
      visited[nv] = True
  
for _ in range(t):
  n = int(input())  # 순열 크기
  graph = list(map(int, input().split()))  # 순열(n개)
  graph.insert(0, 0)  
  visited = [False] * (n + 1)  # 1 ~ n 사용
  cycle = 0  # 순열 사이클 개수

  for i in range(1, n + 1):
    # 방문하지 않은 노드라면
    if not visited[i]:
      bfs(i)      # i노드에서 bfs 호출
      cycle += 1  # 사이클 개수 1증가
  print(cycle)

같은 구조이되 DFS대신 Queue를 활용한 BFS로 구현한 풀이입니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글