[DFS] 백준 실버1 11403번: 경로 찾기(Swift)

2023. 5. 23. 23:25·코테

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

 

11403번: 경로 찾기

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

www.acmicpc.net

풀이과정

해당 문제는 주어진 행렬을 통해 좌표의 경로를 찾는 문제이다.

먼저, 예제를 풀이하자면

위 예제를 통해

(0, 3), (1, 6), (3, 4), (3, 5), (4, 0), (5, 6), (6, 2)의 좌표가 1인 것을 알 수 있다.

이를 보기좋게 정점으로 나눠 표현하면,

0  0 -> 3 -> 4 -> 0 / 0 -> 3 -> 5 -> 6 -> 2

1 1 -> 6 -> 2

2 X

3 3 -> 4 -> 0 / 3 -> 4 -> 6 -> 2

4 4 -> 0 -> 3 -> 4 / 4 -> 0 -> 3 -> 5 -> 6 -> 2

5 5 -> 6 -> 2

6 6 -> 2

위와 같이 풀 수 있다.

이를 코드를 통해 행렬을 만들기 위해서는 DFS를 활용하여 하나씩 경로를 탐색을 통해 탐색한 위치에 1을 저장해야한다.

let N = Int(readLine()!)!

var link: [[Int]] = Array(repeating: [], count: N)
var result = Array(repeating: Array(repeating: "0", count: N), count: N)

for i in 0..<N {
  let y = readLine()!.split(separator: " ").map { Int($0)! }
  for j in 0..<y.count {
    if y[j] == 1 {
      link[i].append(j)
    }
  }
}

func dfs(i: Int, line: Int) {
  for j in link[i] {
    if result[line][j] != "1" {
      result[line][j] = "1"
      if i != line { dfs(i: i, line: line) }
    }
  }
}

for i in 0..<N {
  dfs(i: i, line: i)
}

for line in result {
    print(line.joined(separator: " "))
}

코드를 설명하자면,

먼저, link라는 배열을 통해 정점 i가 갈 수 있는 j을 배열에 담아주었다.

그다음으로 dfs 메서드를 구현하였다.

dfs 메서드 내부는 link[i]라는 배열을 통해 i에서 갈 수 있는 j을 가져와 result의 해당 좌표에 1을 저장한다.

이때 이미 1이 저장되어 있으면 더 이상 탐색할 필요가 없기 때문에 다음 j을 탐색하고,

추가로, i와 현재 line이 같으면, 사실상 탐색이 끝난 것이기 때문에 패스한다.

이처럼 dfs을 라인별로 반복문을 통해 호출해 주면 문제를 해결할 수 있다.

저작자표시 (새창열림)

'코테' 카테고리의 다른 글

[완전 탐색] 백준 실버2 3085번: 사탕 게임(Swift)  (0) 2023.05.26
[다이나믹 프로그래밍 + 구현] 백준 실버3 14501번: 퇴사(Swift)  (0) 2023.05.24
[다이나믹 프로그래밍] 백준 실버3 2579번: 계단 오르기(Swift)  (1) 2023.05.22
[분할정복 + 재귀] 백준 실버1 1629번: 곱셈(Swift)  (0) 2023.05.22
[그리디] 백준 실버4 11047번: 동전 0(Swift)  (0) 2023.05.19
'코테' 카테고리의 다른 글
  • [완전 탐색] 백준 실버2 3085번: 사탕 게임(Swift)
  • [다이나믹 프로그래밍 + 구현] 백준 실버3 14501번: 퇴사(Swift)
  • [다이나믹 프로그래밍] 백준 실버3 2579번: 계단 오르기(Swift)
  • [분할정복 + 재귀] 백준 실버1 1629번: 곱셈(Swift)
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    재귀
    그리디
    코테
    이분탐색
    GCD
    ios
    PhotoKit
    탐색
    Combine
    챌린지
    코딩테스트
    Swift
    Race Condition
    브루트포스 알고리즘
    photos
    실버
    BFS
    노드
    구현
    알고리즘
    비동기
    동시성
    회고
    Property wrapper
    완전탐색
    다이나믹 프로그래밍
    백준
    네부캠
    photoUI
    dfs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[DFS] 백준 실버1 11403번: 경로 찾기(Swift)
상단으로

티스토리툴바