| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- baekjoon
- dp
- for
- 티스토리챌린지
- c99
- 코드
- 프로그래밍
- 너비우선탐색
- 파이썬
- BFS
- 코딩
- dynamic_programming
- python
- C언어
- 깊이우선탐색
- 반복문
- scanf
- qorwns
- 입출력
- 백준
- printf
- 배열
- BOJ
- 다이나믹프로그래밍
- if
- 동적프로그래밍
- 오블완
- code
- dfs
- 프로그래머스
- Today
- Total
TIL 코딩공장
[백준 파이썬] 2668번 숫자고르기 (골드 5) 본문
2668번 숫자고르기 (골드 5)
1. 문제
세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다.
첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다.
첫째 줄에서 숫자를 적절히 뽑으면, 그 뽑힌 정수들이 이루는 집합과,
뽑힌 정수들의 바로 밑의 둘째 줄에 들어있는 정수들이 이루는 집합이 일치한다.
이러한 조건을 만족시키도록 정수들을 뽑되, 최대로 많이 뽑는 방법을 찾는 프로그램을 작성하시오.
예를 들어, N=7인 경우 아래와 같이 표가 주어졌다고 하자.

이 경우에는 첫째 줄에서 1, 3, 5를 뽑는 것이 답이다.
첫째 줄의 1, 3, 5밑에는 각각 3, 1, 5가 있으며 두 집합은 일치한다. 이때 집합의 크기는 3이다.
만약 첫째 줄에서 1과 3을 뽑으면, 이들 바로 밑에는 정수 3과 1이 있으므로 두 집합이 일치한다.
그러나, 이 경우에 뽑힌 정수의 개수는 최대가 아니므로 답이 될 수 없다.
2. 입력
첫째 줄에는 N(1≤N≤100)을 나타내는 정수 하나가 주어진다.
그 다음 줄부터는 표의 둘째 줄에 들어가는 정수들이 순서대로 한 줄에 하나씩 입력된다.
3. 출력
첫째 줄에 뽑힌 정수들의 개수를 출력하고,
그 다음 줄부터는 뽑힌 정수들을 작은 수부터 큰 수의 순서로 한 줄에 하나씩 출력한다.
4. 문제 풀이
문제를 보았을 때 익숙한 맛이 느껴진다...
표에서 사이클의 개수를 세는 문제이다.
사이클의 경우 해당 숫자가 도착점으로서 한번, 출발점으로서 한번 사용되어 2번 반복되기에
사이클이 생성되는 경우 문제의 조건에 부합하는 집합을 만들 수 있다.
사이클의 구성요소들의 경우, 모든 숫자를 시작점으로 하여 사이클을 검사하는데,
시작지점으로 돌아오는 경우 해당 숫자를 사이클 구성요소로 추가한다.
>>>코드
"""
2668번 숫자고르기 (골드 5)
input :
n 표의 길이 (열의 개수)
table 표의 둘째 줄에 들어가는 정수
output :
cnt 뽑힌 정수들의 개수
num 뽑힌 정수들
"""
n = int(input())
table = [0] + [int(input()) for _ in range(n)]
result = []
def DFS(start, num):
visited[num] = True
if not visited[table[num]]:
DFS(start, table[num])
elif start == table[num]:
result.append(start)
return
for i in range(1, n+1):
visited = [False] * (n+1)
DFS(i, i)
result.sort()
print(len(result))
for num in result:
print(num)
5. 문제 링크
https://www.acmicpc.net/problem/2668
'백준, 프로그래머스 > 백준 파이썬' 카테고리의 다른 글
| [백준 파이썬] 18429번 근손실 (실버 3) (0) | 2026.01.26 |
|---|---|
| [백준 파이썬] 2644번 촌수계산 (실버 2) (0) | 2026.01.25 |
| [백준 파이썬] 10451번 순열 사이클 (실버 3) (0) | 2026.01.23 |
| [백준 파이썬] 4963번 섬의 개수 (실버 2) (0) | 2026.01.22 |
| [백준 파이썬] 4673번 셀프 넘버 (실버 3) (0) | 2026.01.21 |
