티스토리 뷰
https://www.acmicpc.net/problem/1261
1261번: 알고스팟
첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미
www.acmicpc.net
시작점에서 가중치가 0 또는 1인 방들을 지나면서 도착점에 도달하는 최소비용을 구하는 문제입니다.
한 점에서 다른 점으로 가는 최소 비용을 구하는 다익스트라 알고리즘을 사용하여 최소 비용을 갱신하여 풀이했습니다.
C++ 소스 코드
#include <cstdio>
#include <queue>
#include <algorithm>
#define INF 98765
using namespace std;
int n,m;
int dist[101][101];
int a[101][101];
int dx[] = {1,0,0,-1}, dy[] = {0,-1,1,0};
int dijkstra(){
priority_queue<pair<int, pair<int, int> > > pq; //비용, (x,y)
dist[1][1] = 0;
pq.push(make_pair(0,make_pair(1,1)));
while(!pq.empty()){
int nowd = -pq.top().first;
int nowx = pq.top().second.first;
int nowy = pq.top().second.second;
pq.pop();
for(int i=0;i<4;i++){
int nx = nowx+dx[i], ny = nowy+dy[i];
if (nx <1 || nx >m || ny <1 || ny<1 || ny >n) continue;
if(dist[nx][ny]> dist[nowx][nowy]+a[nx][ny]){
dist[nx][ny] = dist[nowx][nowy]+a[nx][ny];
pq.push(make_pair(-dist[nx][ny],make_pair(nx,ny)));
}
}
}
return dist[m][n];
}
int main(){
scanf("%d %d", &n, &m);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
scanf("%1d", &a[i][j]);
dist[i][j] = INF;
}
}
printf("%d",dijkstra());
return 0;
}
Swift 소스 코드
import Foundation
func solution(){
let dx = [1,0,0,-1]
let dy = [0,-1,1,0]
let input = readLine() ?? ""
let nums = input.split{ $0 == " " }.map{ Int($0)! }
let m = Int(nums[0])
let n = Int(nums[1])
var visit = [[Bool]](repeating: [Bool](repeating: false, count: m), count: n)
var resultMap = [[Int]](repeating: Array(repeating: 0, count: m), count: n)
var map = [[Int]](repeating: [Int](), count: n)
for i in 0..<n {
guard let strRow = readLine() else { return }
let arrRow = Array(strRow)
let row = arrRow.map { Int(String($0))! }
map[i] = row
}
var queueX:[Int] = [0]
var queueY:[Int] = [0]
while !queueX.isEmpty {
let x = queueX[0]
let y = queueY[0]
queueX.removeFirst()
queueY.removeFirst()
for i in 0..<4 {
let nx = x + dx[i]
let ny = y + dy[i]
if nx < 0 || nx >= n || ny < 0 || ny >= m {
continue
}
if visit[nx][ny] == true {
if resultMap[nx][ny] > resultMap[x][y] + map[nx][ny] {
resultMap[nx][ny] = resultMap[x][y] + map[nx][ny]
queueX.append(nx)
queueY.append(ny)
}
continue
}
resultMap[nx][ny] = resultMap[x][y] + map[nx][ny]
visit[nx][ny] = true
queueX.append(nx)
queueY.append(ny)
}
}
print(resultMap[n-1][m-1])
}
solution()
'Algorithm > 알고리즘 문제풀이' 카테고리의 다른 글
BOJ) 12872 - 플레이리스트 (0) | 2020.06.15 |
---|---|
BOJ) 15686 - 치킨 배달 (0) | 2020.06.13 |
BOJ) 15684 - 사다리 조작 (0) | 2020.06.12 |
BOJ) 15683 - 감시 (0) | 2020.06.11 |
BOJ) 11726 - 2xn 타일링 (1) | 2020.06.11 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- disposeBag
- infallible
- Swift
- UIHostingController
- 알고리즘
- ios
- GraphDB
- blendshape
- rxswift6
- SWEA
- 안드로이드
- Swift weak
- Swift unowned
- coreml
- 카카오인턴십
- 백준
- ARKit
- SwiftUI
- rxswift
- Reactivex
- DispatchQueue
- 프로그래머스
- 백준온라인저지
- 코코아팟
- blendshapes
- cocoapods
- Lottie
- boj
- Kotlin
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함