본문 바로가기

알고리즘/백준

[백준] 2668번 : 숫자고르기

728x90

2668번: 숫자고르기

 

2668번: 숫자고르기

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

www.acmicpc.net

🤔 문제분석

깊이 우선탐색으로 아래 숫자를 뽑아서 그 숫자로 이동하면서, 위쪽 집합과 아래쪽 집합이 동일할 경우 정답 리스트에 값을 추가시켜줍니다. 위쪽 집합과 아래쪽 집합이 같다는건 결국 집합을 만들 수 있다는 조건을 만족시키기 때문입니다.

💻 코드

import sys
input = sys.stdin.readline

N = int(input())
nums = [int(input()) for _ in range(N)]

def dfs(idx):
    if visited[idx] == False:
        visited[idx] = True
        
        top.add(idx+1)
        bottom.add(nums[idx])
        
        if top == bottom:
            ans.extend(list(top))
            return
        
        dfs(nums[idx]-1)
        
    visited[idx] = False

ans = []
for i in range(N):
    visited = [False for _ in range(N)]
    top = set()
    bottom = set()
    dfs(i)
    
ans = list(set(ans))
ans.sort()

print(len(ans))

for n in ans:
    print(n)

🎯 피드백 및 개선사항

Top 과 Bottom을 나누어서 Top과 Bottom이 같을경우 정답리스트에 추가해 가는 풀이 방법이 있었고, 자기자신을 시작으로 사이클이 발생하는 여부를 체크하여 정답리스트에 추가하는 방식이 있습니다. 첫번째 풀이 방법이 뽑힌 정수들의 바로 밑의 둘째 줄에 들어있는 정수들이 이루는 집합이 일치 한다는 조건을 잘 만족시키는 것 같아서 해당 풀이를 참조하게되었습니다.

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 14442번 : 벽 부수고 이동하기 2  (0) 2024.03.24
[백준] 14938번 : 서강 그라운드  (1) 2024.03.22
[백준] 5427번 : 불  (0) 2024.03.21
[백준] 1774번 : 우주신과의 교감  (0) 2024.03.19
[백준] 1956 : 운동  (1) 2024.03.18