본문 바로가기

알고리즘

[leetcode 419] Battleships in a Board

leetcode_419

 

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.

'알고리즘' 카테고리의 다른 글

알고리즘 시작.  (0) 2019.04.28