데이터사이언스 기록기📚

[백준/Python] 2668번(그래프, DFS)_숫자고르기 본문

Coding Test/백준(Python)

[백준/Python] 2668번(그래프, DFS)_숫자고르기

syunze 2023. 6. 4. 14:17

📌문제 유형

그래프 이론, 그래프 탐색, DFS (골드5)

 

📌문제

 

2668번: 숫자고르기

세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절

www.acmicpc.net

 

📌나의 문제풀이

n = int(input())
graph = [[] for _ in range(n+1)]

for i in range(n):
    graph[i+1].append(int(input()))

def dfs(x):
    global v1
    global v2

    v1[x] = 1
    
    if v2[graph[x][0]] == 0:
        v2[graph[x][0]] = 1
        dfs(graph[x][0])
    return

ans = []
for i in range(1,n+1):
    v1 = [0 for _ in range(n+1)]
    v2 = [0 for _ in range(n+1)]

    dfs(i)

    if v1 == v2:
        for n in range(len(v1)):
            if v1[n] == 1:
                ans.append(n)

ans = list(set(ans))
ans.sort()
print(len(ans))
for num in ans:
    print(num)

 

📌 다른사람의 문제풀이

 

[백준-파이썬] 2668: 숫자 고르기

문제로 가기! 처음에는 윗칸의 수를 고르고 그 아래 칸의 수를 보고, 각자 set에 넣어서 두 set이 같은지 다른지 판단해주고.. 같으면 또 다른 (윗칸) 수를 골라보고... 다르면 그 아래칸의 수를 윗

dalseoin.tistory.com

import sys

input = sys.stdin.readline

N = int(input())

adj = [[] for _ in range(N + 1)]

for i in range(1, N + 1):
    adj[i].append(int(input()))


# DFS로 탐색하다가 사이클 발생한 것들을 다 더하면 된다 !!

def dfs(num):
    if visited[num] == False:
        visited[num] = True
        for a in adj[num]:

            tmp_up.add(num)
            tmp_bottom.add(a)

            if tmp_up == tmp_bottom:
                ans.extend(list(tmp_bottom))
                return

            dfs(a)
    visited[num] = False


ans = []

for i in range(1, N + 1):
    visited = [False] * (N + 1)  # 위에 값 기준으로
    tmp_up = set()
    tmp_bottom = set()

    dfs(i)

ans = list(set(ans))
ans.sort()

print(len(ans))
for a in ans:
    print(a)

 

📌 리뷰 

- visited 함수 잘 활용하기 

- 위, 아래 같은거 확인하고 리스트를 늘릴 수도 있음 

728x90
Comments