본문 바로가기
알고리즘

[Swift 알고리즘] 백준 1189 컴백홈

by 코코종 2023. 4. 12.
728x90

안녕하세요 코코종입니다

오늘은 컴~백~~~홈~~으로 찾아왔습니다. (서태지님 뭐 노래라는것만 알고 들어도 잘 모름^^ 저도 MZ세대임)

난이도가 쉬운편이었는데 실버1이네요? 정답률도 높구요! (개꿀문제라는 뜻)

import Foundation

// 1189 컴백홈 완탐 실1
// idea: k번만큼 이동했을 때 딱 집에 도착한 경우를 구한다.

let input = readLine()!.components(separatedBy: " ")
let R = Int(input[0])!
let C = Int(input[1])!
let K = Int(input[2])!

// [r-1][0] 에서 시작, [0][c-1] 까지 이동
var board: [[Int]] = []
for _ in 0..<R {
    let arr = Array(readLine()!)
    board.append( arr.map { c -> Int in
        if c == "." { return 0 }
        if c == "T" { return -1 }
        else { return Int(String(c))! }
    })
}

var answer = 0

func dfs(board: [[Int]], r: Int, c: Int, depth: Int) {
    var board = board
    let dr = [-1, 0, 1, 0]
    let dc = [0, 1, 0, -1]
    
    if board[r][c] == 0 {
        board[r][c] = 1
    }
    
    if depth > K {
        return
    }
    
    if depth == K, r == 0, c == C-1 {
        answer += 1
    } else {
        for i in 0..<4 {
            let rr = r + dr[i]
            let cc = c + dc[i]
            if rr >= 0, rr < R, cc >= 0, cc < C {
                if board[rr][cc] == 0, board[r][c] > 0 { // 미방문시
                    board[rr][cc] = board[r][c] + 1
                    dfs(board: board, r: rr, c: cc, depth: depth + 1)
                }
            }
        }
    }
    
    
    
}

dfs(board: board, r: R-1, c: 0, depth: 1)
print(answer)

물론 또 틀렸습니다만..? 원래 이렇게 틀리면서 하는거 맞죠..?

저는 dfs로 가면서 해당 board의 숫자를 depth로 수정 하면서 파고들어갔는데요! 예제는 맞는데 계속 틀리다고 하지 뭡니까?

그리고 board를 [[Int]] 는 제가 depth를 board에 기입하려고 해서 한번 해봤는데.. 먼가 지저분해졌네요

틀린부분은 board[rr][cc]를 수정하고 다시 돌리지 않은 것이었어요... 탐색문제가 너무 오래방갑이라서 이런 실수를 하고 말았지 뭡니까 허허.. (이제 안틀리겠지..?)

//
//  main.swift
//  BackJoon
//
//  Created by kokojong on 2023/04/12.
//

import Foundation

// 1189 컴백홈 완탐 실1
// idea: k번만큼 이동했을 때 딱 집에 도착한 경우를 구한다.

let input = readLine()!.components(separatedBy: " ")
let R = Int(input[0])!
let C = Int(input[1])!
let K = Int(input[2])!

// [r-1][0] 에서 시작, [0][c-1] 까지 이동
var board: [[Int]] = []
for _ in 0..<R {
    let arr = Array(readLine()!)
    board.append( arr.map { c -> Int in
        if c == "." { return 0 }
        if c == "T" { return -1 }
        else { return Int(String(c))! }
    })
}

var answer = 0

func dfs(board: [[Int]], r: Int, c: Int, depth: Int) {
    var board = board
    let dr = [-1, 0, 1, 0]
    let dc = [0, 1, 0, -1]
    
    if board[r][c] == 0 {
        board[r][c] = 1
    }
    
    if depth > K {
        return
    }
    
    if depth == K, r == 0, c == C-1 {
        answer += 1
    } else {
        for i in 0..<4 {
            let rr = r + dr[i]
            let cc = c + dc[i]
            if rr >= 0, rr < R, cc >= 0, cc < C {
                if board[rr][cc] == 0, board[r][c] > 0 { // 미방문시
                    board[rr][cc] = board[r][c] + 1
                    dfs(board: board, r: rr, c: cc, depth: depth + 1)
                    board[rr][cc] = 0
                }
            }
        }
    }
    
    
    
}

dfs(board: board, r: R-1, c: 0, depth: 1)
print(answer)

간만에 탐색쪽을 풀려고 하니까 진짜 어질어질 하더라구요.. swift로 된 코드도 없고 해서 다른 언어로 된 내용을 보고 참고했답니다!

열어분들은 제가 swift로 풀어뒀으니까 참고하세요~ (진짜 스위프트 푸는사람 너무 없긴 한가봅니다 허허...)

728x90