이 영역을 누르면 첫 페이지로 이동
포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

페이지 맨 위로 올라가기

포렌식 & 개발 이야기 - Forensics & Development

Pental - Forensics / iOS / Windows / Android / Kakaotalk / Telegram / Etc

[골드 4] 백준 1976 - 여행 가자 (파이썬)

  • 2025.04.17 11:02
  • Programming/백준
글 작성자: pental

https://www.acmicpc.net/problem/1976

풀이

  1. N개의 도시가 있고, 어떤 도시끼리는 도로로 연결되어 있다.
  2. M개의 도시가 주어진 여행 계획에 포함되어 있다.
  3. 주어진 도시들이 모두 같은 연결 요소에 속해 있다면 여행이 가능하다.
  4. 연결 정보는 인접 행렬로 주어진다.

이 문제는 그래프 연결 요소 판별 문제이다.

  • BFS를 통해 각 도시가 어떤 연결 요소에 속해 있는지 visit 배열에 저장하고
  • 여행 계획에 포함된 도시들이 모두 같은 연결 요소에 속해 있는지를 확인한다.
  • 하나라도 다르면 NO, 모두 같으면 YES를 출력한다.
N = int(input())   # 도시 수
M = int(input())   # 여행에 포함된 도시 수

adj = [[] for _ in range(N)]
for i in range(N) :
    A = list(map(int, input().split()))
    for j in range(N) :
        if A[j] == 1 :       # 연결되어 있다면
            adj[i].append(j)

인접 행렬을 인접 리스트로 변환하고, adj[i]는 도시 i와 연결되 도시 목록을 나타낸다.

T = list(map(int, input().split()))
for i in range(len(T)) :
    T[i] -= 1   # 0-indexed로 바꿈

이해하기 쉽도록 여행 경로를 0-based 인덱스로 변경한다.

for i in range(N) :
    if visit[i] == -1 :
        queue.append(i)
        visit[i] = i

        while len(queue) != 0 :
            u = queue.popleft()
            for v in adj[u] :
                if visit[v] == -1 :
                    queue.append(v)
                    visit[v] = i

BFS로 모든 연결 요소에 번호를 부여하고, 같은 번호면 같은 그룹에 있는 것이다.

possible = True
for i in range(1, len(T)) :
    if visit[T[i - 1]] != visit[T[i]] :
        possible = False
        break

여행 계획 도시들이 모두 같은 연결 요소에 있는지 확인하고, 답을 출력한다.

코드

# 백준 1976 - 여행 가자
# 분류 : BFS

from collections import deque

N = int(input())
M = int(input())

adj = [[] for _ in range(N)]
for i in range(N) :
    A = list(map(int, input().split()))

    for j in range(N) :
        if A[j] == 1 :
            adj[i].append(j)

T = list(map(int, input().split()))
for i in range(len(T)) :
    T[i] -= 1

visit = [-1] * N
queue = deque()

for i in range(N) :
    if visit[i] == -1 :
        queue.append(i)
        visit[i] = i

        while len(queue) != 0 :
            u = queue.popleft()

            for v in adj[u] :
                if visit[v] == -1 :
                    queue.append(v)
                    visit[v] = i

possible = True
for i in range(1, len(T)) :
    if visit[T[i - 1]] != visit[T[i]] :
        possible = False
        break

if possible :
    print("YES")
else :
    print("NO")
저작자표시 비영리 (새창열림)

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

[실버 1] 백준 1932 - 정수 삼각형 (파이썬)  (0) 2025.04.18
[실버 2] 백준 11053 - 가장 긴 증가하는 부분 수열 (파이썬)  (0) 2025.04.17
[브론즈 1] 백준 1526 - 가장 큰 금민수 (파이썬)  (0) 2025.04.17
[실버 3] 백준 1904 - 01타일 (파이썬)  (0) 2025.04.16
[골드 5] 백준 1038 - 감소하는 수 (파이썬)  (0) 2025.04.16

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [실버 1] 백준 1932 - 정수 삼각형 (파이썬)

    [실버 1] 백준 1932 - 정수 삼각형 (파이썬)

    2025.04.18
  • [실버 2] 백준 11053 - 가장 긴 증가하는 부분 수열 (파이썬)

    [실버 2] 백준 11053 - 가장 긴 증가하는 부분 수열 (파이썬)

    2025.04.17
  • [브론즈 1] 백준 1526 - 가장 큰 금민수 (파이썬)

    [브론즈 1] 백준 1526 - 가장 큰 금민수 (파이썬)

    2025.04.17
  • [실버 3] 백준 1904 - 01타일 (파이썬)

    [실버 3] 백준 1904 - 01타일 (파이썬)

    2025.04.16
다른 글 더 둘러보기

정보

포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

  • 포렌식 & 개발 이야기 - Forensics & Development의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

카테고리

  • Category (452)
    • Forensics (105)
      • Magnet AXIOM (28)
      • Digital Forensics Informati.. (9)
      • Iphone Forensics (24)
      • DFC (7)
      • 디지털포렌식전문가2급 자격증 (10)
      • FTK ACE 자격증 (7)
    • 이것저것 (7)
      • Ubuntu (6)
      • 디스코드 봇 (4)
      • Volatility GUI (2)
    • CTF (32)
      • NEWSECU (14)
      • CTF-d (5)
      • Puzzel - Network Forensics (2)
      • Security Traps (2)
      • system32.kr (5)
      • HMCTF (4)
    • Programming (260)
      • C (10)
      • Python (11)
      • 백준 (206)
      • 프로그래머스 (32)
    • 그냥 개발 및 잡담 (16)
      • Docker (2)
      • Google Cloud (3)
      • OS 개발 (3)
    • Best of Best (20)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 백준
  • pental
  • 파이썬
  • 프로그래머스
  • axiom
  • Forensics
  • 포렌식
  • 디지털포렌식
  • 전체 보기…

정보

pental의 포렌식 & 개발 이야기 - Forensics & Development

포렌식 & 개발 이야기 - Forensics & Development

pental

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © pental.

티스토리툴바