https://leetcode.com/problems/battleships-in-a-board/
class Solution {
fun countBattleships(board: Array<CharArray>): Int {
var count = 0
val result: Int = board.run {
forEachIndexed { i, row ->
row.forEachIndexed rowForEach@ { j, item ->
if('.' == item) {
return@rowForEach
} else if( i != 0 && 'X' == this[i-1][j]) {
return@rowForEach
} else if( j != 0 && 'X' == row[j-1]) {
return@rowForEach
} else {
count++
}
}
}
count
}
return result
}
}
해결 과정
배운 점
1) 최근에 학습한 scope function을 사용하여 문제를 풀고 싶었다.
그래서, run을 사용해보았고 lamda내에서 this 로 접근하며 lamda실행결과를 반환한다는 것을 실습해볼 수 있었다.
2) forEachIndexed 함수를 사용해보았다. index 값도 함께 전달을 받아 사용할 수 있어서 편리했다.
3) forEach문에서 label을 사용하여, continue문을 구현할 수 있다. rowForEach@ 라벨을 붙였고, return@rowForEach를 호출하여, continue문처럼 사용을 했다. (https://kotlinlang.org/docs/reference/returns.html)
3) 해결과정에서 배운 점도 있는데, "되는" 케이스가 꽤 많아서 반대로 "안되는" 케이스를 생각했더니 (count를 새면 안되는 케이스)
오히려 문제가 꽤 쉽게 풀렸다.
실행 결과 (2019.05.14)
Runtime: 164 ms, faster than 100.00% of Kotlin online submissions for Battleships in a Board.
Memory Usage: 39.4 MB, less than 100.00% of Kotlin online submissions for Battleships in a Board.