일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 파일 시스템
- 시간복잡도
- C
- level13
- windosws wbcs
- SWiFT
- pwnable.kr
- 스택
- c언어
- ftz level13
- 재귀
- 큐
- HTML
- Stack
- System
- 암호수학
- LoB
- OSI
- 미로 탐색 알고리즘
- web
- 자료구조
- 백준
- PHP
- War Game
- ftz
- 정렬 알고리즘
- windosw 문자열
- 파이썬
- 두근두근 자료구조
- Java
Archives
- Today
- Total
나의 기록, 현진록
[Swift] 백준 17182 우주 탐사선 본문
반응형
https://www.acmicpc.net/problem/17182
1. 문제이해
- 행성 간 이동에 걸리는 시간이 2차원 행렬로 주어진다.
- planet[ i ][ j ]은 i 행성에서 j 행성까지 이동하는데 걸리는 시간이다.
- 이미 방문한 행성도 다시 방문 가능
- 출발은 K 행성부터 시작한다.
- 모든 행성을 탐사하는데 걸리는 최소 시간 구하기
2. 접근방법
- 이미 방문한 행성도 다시 방문이 가능하기 때문에 A → B 보다 A → ? → B로 가는 경로가 더 가까울 수 있다.
- planet[i][j]는 i → j 로 직접 가는 시간이 아닌 i → j 로 갈 때 최소 시간이 저장되도록 플로이드 워셜 알고리즘 사용
- planet[i][j]에 각 행성마다 이동하는 최소 시간이 저장되어 있다면 이미 방문한 행성은 방문하지 않도록 dfs+백트래킹으로 모든 행성을 탐사하는데 걸리는 최소 시간을 구할 수 있다.
3. 코드
func solution(){
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let N = input[0]
let K = input[1]
var planet = [[Int]]()
var result = Int.max
var visited = Array(repeating: false, count: N)
// K 부터 출발
visited[K] = true
for _ in 0..<N{
planet.append(readLine()!.split(separator: " ").map{Int(String($0))!})
}
func dfs(cur: Int, dept: Int, T: Int){
if dept == N{
result = min(result, T)
return
}
for i in 0..<N{
if !visited[i]{
visited[i] = true
dfs(cur: i, dept: dept+1, T: T + planet[cur][i])
visited[i] = false
}
}
}
dfs(cur: K, dept: 1, T: 0)
print(result)
}
solution()
반응형
'Programming > Algorithm & Data Structure' 카테고리의 다른 글
[Swift] 백준 2116 주사위 쌓기 (0) | 2024.12.03 |
---|---|
[Swift] 백준 토마토 7569 (0) | 2024.11.18 |
[Swift] 프로그래머스 입국심사 (2) | 2024.11.13 |
[Swift] 백준 게임 1072 (0) | 2024.11.12 |
[Swift] 프로그래머스 코딩테스트 연습 > 연습문제 > 인사고과 (0) | 2023.05.03 |