반응형
rolypolytoy
현's story
rolypolytoy
전체 방문자
오늘
어제
  • 분류 전체보기
    • 현's tory
      • 여행
      • 개인사업
      • 컨프런스
      • 채용지원
    • Vision AI | 3D Graphics
      • Vision AI
      • OpenGL
    • 프로그래밍 언어
      • C++
      • Python
    • Computer Science
      • 운영체제
    • 알고리즘
      • 백준
      • 프로그래머스
      • 개념정리
    • 유용한 링크
      • 개발

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 상표특허출원
  • 백준이분탐색
  • 아키텍처패턴
  • PlantUML
  • openglvscode
  • 백준2169
  • vscodeopengl
  • 프로그래머스실패율
  • 백준1756
  • iOSMetal
  • 알고리즘구현
  • 백준2302
  • 백준2533
  • 백준13397
  • 백준
  • 백준문제풀이
  • 디자인패턴
  • 백준알고리즘
  • IOS
  • 사회망서비스
  • sync
  • 백준다이나믹
  • 다이나믹프로그래밍
  • 백준17471
  • 백준사회망서비스
  • EffectiveC++
  • iOS비동기
  • DFS조합
  • 알고리즘
  • c++

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
rolypolytoy

현's story

[백준 2178] 미로 탐색 Swift
알고리즘/백준

[백준 2178] 미로 탐색 Swift

2020. 11. 27. 20:14
반응형

www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

이번 문제는 단순한 BFS, DFS탐색 문제입니다.

 

기본 문제이지만, Swift 언어 활용을 위해 풀어보려고 합니다.

 

최소 거리는 BFS탐색을 이용해서 자주 풀기 때문에 BFS코드로 풀었습니다.

 

map함수는 갈 수 있는 곳 1과 갈 수 없는 곳 0으로 입력으로 받았고요. 

check함수는 방문했는지 여부, distance는 최소거리를 구하기 위해 사용했습니다. 

 

 

주의 해야할 점은 입력값의 map이 숫자가 붙어서 나오는데,

Swift는 readLine()!.map { Int(String($0)) ! }를 이용하면 붙은 정수를 하나씩 떼서 정수 배열로 만들 수 있습니다.

 

 솔루션 코드는 다음과 같습니다.

 

//
//  main.swift
//  swift_test
//
//

import Foundation

let t = readLine()!.split(separator: " ").map {Int($0)!}
let N = t[0]
let M = t[1]

var dx = [1, -1, 0, 0]
var dy = [0, 0, -1, 1]

var map = Array(repeating: Array(repeating: 0, count: M), count: N)
var check = Array(repeating: Array(repeating: false, count: M), count: N)
var distance = Array(repeating: Array(repeating: 0, count: M), count: N)

for i in 0..<N{
    var temp: [Int]
    temp = readLine()!.map { Int(String($0))! }
    
    map[i] = temp
}

func bfs(){
    
    distance[0][0] = 1
    
    check[0][0] = true
    
    var q = Array<(Int, Int)>()
    
    q.append((0, 0))
    
    while !q.isEmpty{
        let poped = q[0]
        q.remove(at: 0)
        
        let x = poped.0
        let y = poped.1
        
        for k in 0..<4{
            let nx = x + dx[k]
            let ny = y + dy[k]
            
            if nx >= 0 && nx < N && ny >= 0 && ny < M && !check[nx][ny] && map[nx][ny] == 1{
                
                distance[nx][ny] = distance[x][y] + 1
                
                check[nx][ny] = true
                q.append((nx, ny))
                
            }
            
        }
        
        
    }
    
    
}

bfs()

print(distance[N-1][M-1])
반응형
저작자표시 비영리 변경금지 (새창열림)

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

[백준 1707] 이분 그래프 C++  (0) 2021.01.11
[백준 11660] 구간 합 구하기 5 C++  (0) 2021.01.10
[백준 11724] 연결 요소의 개수 C++  (0) 2020.08.28
[백준 16929] Two Dots C++  (0) 2020.08.25
[백준 2667] 단지번호붙이기 C++  (0) 2020.08.24
    '알고리즘/백준' 카테고리의 다른 글
    • [백준 1707] 이분 그래프 C++
    • [백준 11660] 구간 합 구하기 5 C++
    • [백준 11724] 연결 요소의 개수 C++
    • [백준 16929] Two Dots C++
    rolypolytoy
    rolypolytoy

    티스토리툴바