새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 2668 숫자고르기

by 언호 2022. 6. 16.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 접근 및 이해

문제의 조건을 만족시키도록 정수를 뽑기 위해서는 첫째줄의 번호들을 순서대로 모두 뽑을때, 사이클이 생성되는 집합을 찾아야 했습니다.

첫번째 줄에서 선택한 인덱스와 두번째 줄에서 나온 숫자가 같은지 판별을 하기 위하여 두개의 변수를 이용하여 관리하였습니다.

2) 알고리즘

  • DFS

3) 풀이 코드

사용 언어 - Python

import sys
sys.stdin = open('input.txt')

def solution(start):
    global answer

    stack = [start]                             # 스택
    chk_first = []                              # 첫번째 줄에서 선택한 인덱스
    chk_second = []                             # 두번째 줄에서 나온 숫자

    while stack:
        node = stack.pop()
        if node not in chk_first:               # 첫번째 줄에서 선택하지 않은 인덱스이면
            chk_first.append(node)              # 선택한 인덱스 추가
            next = li[node] - 1                 # 두번째 줄의 값
            chk_second.append(next)             # 두번째 줄의 값 추가
            stack.append(next)                  # 다음 탐색을 위해 스택에 값 추가

    if set(chk_first) == set(chk_second):       # 두개의 줄의 숫자 집합이 같은 경우
        answer.extend(chk_first)                # 정답에 추가

N = int(sys.stdin.readline())                           # 숫자의 개수
li = [int(sys.stdin.readline()) for _ in range(N)]      # 첫째줄과 연결된 두번째 줄의 숫자들
answer = []                             

for i in range(N):              # 정답에 없는 숫자들 탐색
    if i not in answer:
        solution(i)

print(len(answer))              # 출력
for a in sorted(answer):
    print(a+1)

🔗 문제 링크

- https://www.acmicpc.net/problem/2668

 

2668번: 숫자고르기

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

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 2580 스도쿠  (0) 2022.06.20
[백준] 1937 욕심쟁이 판다  (0) 2022.06.17
[백준] 2251 물통  (0) 2022.06.15
[백준] 13023 ABCDE  (0) 2022.06.14
[백준] 10282 해킹  (0) 2022.06.12

댓글