문제 링크 (opens new window)

# 풀이 (시간초과)

  1. 로직은 맞는데 문자열 처리가 스위프트에서 느려서 시간초과 발생하는 것으로 판단
  2. 추후 비트마스킹 학습 이후 재풀이 예정
import Foundation

let rc = readLine()!.split(separator: " ").map { Int($0)! }; let r = rc[0]; let c = rc[1]
var adj: [[Character]] = .init(repeating: .init(repeating: " ", count: c), count: r)
var visitedAlphabet: [Bool] = .init(repeating: false, count: 26)
var ret = 0
let dy = [-1, 0, 1, 0]; let dx = [0, 1, 0, -1]


for row in 0..<r {
    adj[row] = readLine()!.map { $0 }
}

func dfs(_ y: Int, _ x: Int, _ cnt: Int) {
    ret = max(cnt, ret)

    for i in 0..<4 {
        let ny = dy[i] + y
        let nx = dx[i] + x

        if ny < 0 || nx < 0 || ny >= r || nx >= c {
            continue
        }
        let next = Int(adj[ny][nx].asciiValue!) - Int(Character("A").asciiValue!)

        if !visitedAlphabet[next] {
            visitedAlphabet[next] = true
            dfs(ny, nx, cnt + 1)
            visitedAlphabet[next] = false
        }
    }
}

visitedAlphabet[Int(adj[0][0].asciiValue!) - Int(Character("A").asciiValue!)] = true
dfs(0, 0, 1)

print(ret)