[백준] 10971번: 외판원 순회 2 - Kotlin[코틀린]

2023. 9. 24. 20:53·알고리즘/Baekjoon

문제

 

 

10971번: 외판원 순회 2

첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j

www.acmicpc.net

 


풀이

 

 이 문제는 Traveling Salesman problem(TSP)라고 불리는 외판원 순회 문제 유형의 가장 기본적인 형태이다.

 

 DFS로 풀이하면 된다. 한 도시에서 모든 도시를 방문했을 때, 출발지로 다시 돌아올 수 있다면 총 비용을 현재까지의 최솟값과 비교하여 저장하는 방식이다. 모든 도시를 한 번씩 출발지로 하여 dfs()를 호출하면 된다.

 


코드

 

import java.util.*
import kotlin.math.*

fun main() {
    val br = System.`in`.bufferedReader()
    val bw = System.out.bufferedWriter()

    val city = br.readLine().toInt()

    val cost = Array(city){ IntArray(city) }
    for(i in 0 until city) {
        val st = StringTokenizer(br.readLine())
        for(j in 0 until city) {
            cost[i][j] = st.nextToken().toInt()
        }
    }

    val visited = BooleanArray(city)
    var min  = Long.MAX_VALUE

    fun dfs(start: Int, now: Int, res: Long, depth: Int) {
        if(depth == city) { // 모든 도시 방문
            if(cost[now][start] != 0) { // 출발지와 연결된 경우
                min = min(min, res + cost[now][0])
            }
            return
        }

        for(i in 1 until city) {
            if(!visited[i] && cost[now][i] != 0) {
                visited[i] = true
                dfs(start, i, res + cost[now][i], depth+1)
                visited[i] = false
            }
        }
    }

    for(i in 0 until city) {
        visited.fill(false) // 방문 처리 배열 초기화
        visited[i] = true
        dfs(i, i, 0, 1)
    }

    bw.write("$min")
    bw.flush()
    bw.close()
    br.close()
}

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

[백준] 7576번: 토마토 - Kotlin[코틀린]  (0) 2023.09.27
[백준] 1904번: 01타일 - Kotlin[코틀린]  (0) 2023.09.26
[백준] 1931번: 회의실 배정 - Kotlin[코틀린]  (0) 2023.09.23
[백준] 2579번: 계단 오르기 - Kotlin[코틀린]  (0) 2023.09.21
[백준] 9095번: 1, 2, 3 더하기 - Kotlin[코틀린]  (0) 2023.09.21
'알고리즘/Baekjoon' 카테고리의 다른 글
  • [백준] 7576번: 토마토 - Kotlin[코틀린]
  • [백준] 1904번: 01타일 - Kotlin[코틀린]
  • [백준] 1931번: 회의실 배정 - Kotlin[코틀린]
  • [백준] 2579번: 계단 오르기 - Kotlin[코틀린]
junghoooooon
junghoooooon
  • junghoooooon
    코드팁스
    junghoooooon
  • 전체
    오늘
    어제
    • 전체 (120)
      • 안드로이드 (0)
        • 코드팁스 (0)
      • 유니티 (0)
        • 코드팁스 (0)
      • 알고리즘 (118)
        • 알고리즘 (0)
        • Baekjoon (118)
      • GitHub (0)
      • 티스토리 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      수학
      재귀
      분리집합
      이분 탐색
      분할 정복
      정렬
      스택
      투 포인터
      BFS
      우선순위 큐
      그리디
      피보나치
      그래프이론
      DP
      백트래킹
      그래프 탐색
      크루스칼
      문자열
      에라토스테네스의 체
      구현
      MST
      티스토리
      dfs
      브루트포스
      누적 합
      모듈러 곱셈 역원
      프림
      소수 판정
      유니온파인드
      큐
    • hELLO· Designed By정상우.v4.10.2
    junghoooooon
    [백준] 10971번: 외판원 순회 2 - Kotlin[코틀린]
    상단으로

    티스토리툴바