From 24965edea255a53faa8b915da0ec9c8a512dcb86 Mon Sep 17 00:00:00 2001 From: Lanre Adedara Date: Tue, 5 Nov 2024 07:58:37 +0100 Subject: [PATCH] feat: add swift implementation to lcp problem: No.03 --- .../README.md" | 43 +++++++++++++++++++ .../Solution.swift" | 38 ++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 "lcp/LCP 03. \346\234\272\345\231\250\344\272\272\345\244\247\345\206\222\351\231\251/Solution.swift" diff --git "a/lcp/LCP 03. \346\234\272\345\231\250\344\272\272\345\244\247\345\206\222\351\231\251/README.md" "b/lcp/LCP 03. \346\234\272\345\231\250\344\272\272\345\244\247\345\206\222\351\231\251/README.md" index c086edd1b0eb7..da59c19bea817 100644 --- "a/lcp/LCP 03. \346\234\272\345\231\250\344\272\272\345\244\247\345\206\222\351\231\251/README.md" +++ "b/lcp/LCP 03. \346\234\272\345\231\250\344\272\272\345\244\247\345\206\222\351\231\251/README.md" @@ -239,6 +239,49 @@ function robot(command: string, obstacles: number[][], x: number, y: number): bo } ``` +#### Swift + +```swift +class Solution { + func robot(_ command: String, _ obstacles: [[Int]], _ x: Int, _ y: Int) -> Bool { + var visited: Set<[Int]> = [] + var i = 0, j = 0 + visited.insert([i, j]) + + for c in command { + if c == "U" { + j += 1 + } else { + i += 1 + } + visited.insert([i, j]) + } + + func canReach(_ targetX: Int, _ targetY: Int) -> Bool { + let k = min(targetX / i, targetY / j) + return visited.contains([targetX - k * i, targetY - k * j]) + } + + if !canReach(x, y) { + return false + } + + for obstacle in obstacles { + let obstacleX = obstacle[0] + let obstacleY = obstacle[1] + if obstacleX > x || obstacleY > y { + continue + } + if canReach(obstacleX, obstacleY) { + return false + } + } + + return true + } +} +``` + diff --git "a/lcp/LCP 03. \346\234\272\345\231\250\344\272\272\345\244\247\345\206\222\351\231\251/Solution.swift" "b/lcp/LCP 03. \346\234\272\345\231\250\344\272\272\345\244\247\345\206\222\351\231\251/Solution.swift" new file mode 100644 index 0000000000000..7f8aebe2c5231 --- /dev/null +++ "b/lcp/LCP 03. \346\234\272\345\231\250\344\272\272\345\244\247\345\206\222\351\231\251/Solution.swift" @@ -0,0 +1,38 @@ +class Solution { + func robot(_ command: String, _ obstacles: [[Int]], _ x: Int, _ y: Int) -> Bool { + var visited: Set<[Int]> = [] + var i = 0, j = 0 + visited.insert([i, j]) + + for c in command { + if c == "U" { + j += 1 + } else { + i += 1 + } + visited.insert([i, j]) + } + + func canReach(_ targetX: Int, _ targetY: Int) -> Bool { + let k = min(targetX / i, targetY / j) + return visited.contains([targetX - k * i, targetY - k * j]) + } + + if !canReach(x, y) { + return false + } + + for obstacle in obstacles { + let obstacleX = obstacle[0] + let obstacleY = obstacle[1] + if obstacleX > x || obstacleY > y { + continue + } + if canReach(obstacleX, obstacleY) { + return false + } + } + + return true + } +} \ No newline at end of file