Leetcode79. Word Search (w. kotlin)
728x90
Given an m x n grid of characters board and a string word, return true if word exists in the grid.
The word can be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or vertically neighboring. The same letter cell may not be used more than once.
Example 1:

val board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]] val word = "SEE" Output: true
Approach
해당 문제는 Backtracking 을 사용하여 상하좌우 의 문자열을 이어 나가면서 기대하는 Word 와 일치 하는지 에 대한 결과를 구하는 문제입니다.
- word = "SEE" 중 S 가 위치한 (row, col) 값을 찾습니다.
- (1, 0) 에 위치한 S 의 상하좌우 를 DFS 로 탐색합니다. 방문한 곳은 board 에 "*" 로 마킹합니다.
- LEFT (index 를 벗어남) , RIGHT(F 유효하지않음), UP(A 유효하지 않음), DOWN(A 유효하지 않음) 상하좌우 모두 유효하지 않기 때문에 넘어갑니다.
- "*" 로 마킹 한 곳은 다시 문자열을 채워줍니다.
- (1, 3) 에 위치한 S 를 상하좌우 를 DFS 로 탐색합니다. DOWN 에 위치한 (E) 가 유효 하고 E 로 DFS 탐색을 했을시 LEFT 가 유효하여 true 가 retrun 됩니다.
fun exist(board: Array<CharArray>, word: String): Boolean { if (board.isEmpty()) return false if (word.isBlank()) return true val checker = Array(board.size) { BooleanArray(board.first().size) } for (i in board.indices) { for (j in board[i].indices) { if (helper(board, checker, word, i, j, 0)) { return true } } } return false } fun helper( board: Array<CharArray>, checker: Array<BooleanArray>, word: String, row: Int, col: Int, start: Int ): Boolean { if (start == word.length) return true if (!isValid(row, col, board) || board[row][col] != word[start]) return false board[row][col] = '*' val result = helper(board, checker, word, row + 1, col, start + 1) || helper(board, checker, word, row - 1, col, start + 1) || helper(board, checker, word, row, col + 1, start + 1) || helper(board, checker, word, row, col - 1, start + 1) board[row][col] = word[start] return result } fun isValid(row: Int, col: Int, board: Array<CharArray>): Boolean { return row in (board.indices) && col in (board.first().indices) } fun main() { val board = arrayOf( charArrayOf('A', 'B', 'C', 'E'), charArrayOf('S', 'F', 'C', 'S'), charArrayOf('A', 'D', 'E', 'E'), ) val word = "ABCCED" exist(board, word).also { println(it) } }
728x90
'Algorithm > leetcode' 카테고리의 다른 글
[leetcode] 689. Maximum Sum of 3 Non-Overlapping Subarrays (0) | 2024.12.28 |
---|---|
leetcode - 862. Shortest Subarray with Sum at Least K (0) | 2024.11.17 |
Leetcode86. partition list (kotlin) (0) | 2023.04.22 |
Easy - 9 . is palidrome (with golang) (0) | 2022.04.21 |
댓글
이 글 공유하기
다른 글
-
[leetcode] 689. Maximum Sum of 3 Non-Overlapping Subarrays
[leetcode] 689. Maximum Sum of 3 Non-Overlapping Subarrays
2024.12.28https://leetcode.com/problems/maximum-sum-of-3-non-overlapping-subarrays/description/ 해당 문제는 정수배열 nums 와 k 가 주어졌을 때 겹치지 않는 최대합을 가지는 길이 k 의 부분 배열 3개를 찾아서 반환하는 문제입니다여기서 주의할 점은 정답이 여러개 인 경우 index 가 작은것 부터 반환해야 합니다. Approach해당 문제는 총 3개의 부분 배열을 반환해야 합니다 그러므로 3 개의 section 으로 분할 할 수 있고 이것을 left, middle, right 라고 정의 하겠습니다. 먼저 sliding window 를 통해 구간 합을 미리 구해 두겠습니다.val sums = IntArray(n) { i -> nums.sl… -
leetcode - 862. Shortest Subarray with Sum at Least K
leetcode - 862. Shortest Subarray with Sum at Least K
2024.11.17https://leetcode.com/problems/shortest-subarray-with-sum-at-least-k/description/?envType=daily-question&envId=2024-11-17 Approach해당 문제를 O(N) 시간 복잡도로 문제를 해결 하기 위해서 PrefixSum 과 단조 증가 (Monotonic increasing) Queue 를 사용할 예정입니다. 해당 문제를 한글로 번역해보자면 다음과 같습니다. 정수 배열 nums와 정수 k가 주어졌을 때, 다음 조건을 만족하는 가장 짧은 부분 배열의 길이를 반환하세요:부분 배열의 합이 최소한 k 이상이어야 함부분 배열은 비어있지 않아야 함만약 이러한 조건을 만족하는 부분 배열이 존재하지 않는다면 -1을 반환여기서 **… -
Leetcode86. partition list (kotlin)
Leetcode86. partition list (kotlin)
2023.04.22 -
Easy - 9 . is palidrome (with golang)
Easy - 9 . is palidrome (with golang)
2022.04.21
댓글을 사용할 수 없습니다.