728x90
https://www.acmicpc.net/problem/2668
2668번: 숫자고르기
세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절
www.acmicpc.net
투포인터와 누적합을 같이 사용하면 쉽게 풀 수 있습니다. 누적합 리스트를 만든 뒤
백준 2230 <수 고르기>
https://www.acmicpc.net/problem/2230 2230번: 수 고르기 N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우
dev-diary-0717.tistory.com
앞선 수 고르기 문제와 같은 방법으로 비교하며 풀면 됩니다.
def solution(N, table):
# 스택 리스트
stack_list = []
# 자신의 값을 가지면 미리 넣어두기
for i in range(N+1):
if table[i][0] == table[i][1]:
stack_list.append(i)
# 테이블 순회하며 DFS
for idx in range(N):
# 방문 명단
memo = [0 if num in stack_list else 1 for num in range(N+1)]
# 0일때는 스킵, stack_list 에 포함되면 스킵
if idx and idx not in stack_list:
# 스택
stack = [idx]
while True:
# 다음 경로
next_num = table[stack[-1]][1]
# 방문하지 않은 경우
if memo[next_num]:
# 다음 경로가 시작점일 때
if next_num == stack[0]:
# 스택 리스트에 삽입
stack_list.extend(stack)
break
# 아니면 그냥 경로에 추가
stack.append(next_num)
memo[next_num] = 0
else:
break
return len(stack_list), sorted(stack_list)
N = int(input())
table = [[i+1, int(input())] for i in range(N)]
table = [[0, -1]] + table
length, stack_list = solution(N, table)
print(length)
for num in stack_list:
print(num)
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 2003 <수들의 합 2> Python (0) | 2023.11.10 |
---|---|
백준 1644 <소수의 연속합> Python (0) | 2023.11.10 |
백준 2230 <수 고르기> Python (0) | 2023.11.09 |
백준 2217 <로프> Python (0) | 2023.11.08 |
백준 1026 <보물> Python (0) | 2023.11.08 |