프로그래머스

[프로그래머스][Kotlin]혼자서 하는 틱택토

끝까지 처음처럼 2023. 2. 27. 17:14
728x90

해당 문제는 옳지 않은 케이스에 대한 구분법만 잘 생각한다면 쉽게 구현 및 작성 할 수 있는 문제였습니다.

 

첫번째 오류로는 x가 o보다 많은 경우

두번째 오류로는 o의 갯수가 x의 갯수보다 2개 이상 많은 경우

세번째 오류로는 o가 이겼으나 x를 추가로 둔 경우

네번째 오류로는 x가 이겼으나 o를 추가로 둔 경우

다섯번째 오류로는 o,x 둘다 이겼을 경우입니다.

 

해당 케이스를 제외한다면 나머지는 모두 옳은 케이스라고 할 수 있습니다.

저의 경우 다섯번재 오류를 처음에 생각하지 못하여 몇번의 실패를 맛보았으나 손으로 그려보면서 해당 오류를 찾아 코드를 수정하여 작성하였더니 통과하였었습니다.

 

하기는 작성한 코드와 실행 결과 입니다.

class Solution {
    fun solution(board: Array<String>): Int {
        var answer: Int = 1
        var oCount = 0
        var xCount = 0

        board.forEach{
            val check = it.toCharArray()
            check.forEach{
                if(it == 'O') oCount++
                if(it == 'X') xCount++
            }
        }

        if(oCount < xCount){
            answer = 0
        } else if(oCount - xCount > 1){
            answer = 0
        } else if(xWin(board) && oWin(board)){
            answer = 0
        } else if(xWin(board) && (xCount < oCount)){
            answer = 0
        } else if(oWin(board) && (xCount == oCount)){
            answer = 0
        }

        return answer
    }

    fun xWin(board: Array<String>): Boolean{
        //가로 완성이 되어있는지 확인
        var check1 = false
        for(i in 0 .. board.size-1){
            if(board[i] == "XXX"){
                check1 = true
                break
            }
        }
        if(check1) return check1
        else {
            //세로 완성이 되어있는지 확인
            var check2 = false

            var one = ""
            var two = ""
            var three = ""
            for(i in 0 .. board.size-1){
                one += board[i][0]
                two += board[i][1]
                three += board[i][2]
            }

            if(one == "XXX"){
                check2 = true
            }
            if(two == "XXX"){
                check2 = true
            }
            if(three == "XXX"){
                check2 = true
            }
            if(check2) return check2
            else {
                //대각선으로 완성이 되어있는지 확인
                var check3 = false

                var count = 0
                var temp = ""
                for(i in 0 .. board.size-1){
                    temp += board[i][count]
                    count++
                }
                if(temp == "XXX"){
                    check3 = true
                }
                if(check3) return check3
                else{
                    // 반대 대각선 체크
                    var count = 2
                    var temp = ""
                    for(i in 0 .. board.size-1){
                        temp += board[i][count]
                        count--
                    }
                    if(temp == "XXX"){
                        check3 = true
                    }
                    if(check3) return check3
                }
            }
        }
        return false
    }

    fun oWin(board: Array<String>): Boolean{
        //가로 완성이 되어있는지 확인
        var check1 = false
        for(i in 0 .. board.size-1){
            if(board[i] == "OOO"){
                check1 = true
                break
            }
        }
        if(check1) return check1
        else {
            //세로 완성이 되어있는지 확인
            var check2 = false

            var one = ""
            var two = ""
            var three = ""
            for(i in 0 .. board.size-1){
                one += board[i][0]
                two += board[i][1]
                three += board[i][2]
            }

            if(one == "OOO"){
                check2 = true
            }
            if(two == "OOO"){
                check2 = true
            }
            if(three == "OOO"){
                check2 = true
            }
            if(check2) return check2
            else {
                //대각선으로 완성이 되어있는지 확인
                var check3 = false

                var count = 0
                var temp = ""
                for(i in 0 .. board.size-1){
                    temp += board[i][count]
                    count++
                }
                if(temp == "OOO"){
                    check3 = true
                }
                if(check3) return check3
                else{
                    // 반대 대각선 체크
                    var count = 2
                    var temp = ""
                    for(i in 0 .. board.size-1){
                        temp += board[i][count]
                        count--
                    }
                    if(temp == "OOO"){
                        check3 = true
                    }
                    if(check3) return check3
                }
            }
        }
        return false
    }
}
테스트 1 통과 (19.03ms, 59.4MB)
테스트 2 통과 (0.04ms, 62.5MB)
테스트 3 통과 (18.88ms, 59.9MB)
테스트 4 통과 (28.45ms, 60.3MB)
테스트 5 통과 (0.02ms, 62MB)
테스트 6 통과 (15.40ms, 60.6MB)
테스트 7 통과 (12.02ms, 59.6MB)
테스트 8 통과 (13.38ms, 59.6MB)
테스트 9 통과 (0.03ms, 61.9MB)
테스트 10 통과 (0.03ms, 61.5MB)
테스트 11 통과 (18.92ms, 60.7MB)
테스트 12 통과 (19.03ms, 59.9MB)
테스트 13 통과 (18.74ms, 60.9MB)
테스트 14 통과 (13.17ms, 60.4MB)
테스트 15 통과 (12.31ms, 62MB)
테스트 16 통과 (0.03ms, 59.9MB)
테스트 17 통과 (14.95ms, 59.3MB)
테스트 18 통과 (0.02ms, 59.5MB)
테스트 19 통과 (13.93ms, 61.4MB)
테스트 20 통과 (14.49ms, 61MB)
테스트 21 통과 (14.92ms, 62MB)
테스트 22 통과 (12.47ms, 61.8MB)
테스트 23 통과 (12.49ms, 59.8MB)
테스트 24 통과 (13.84ms, 59.8MB)
테스트 25 통과 (18.76ms, 60.7MB)
테스트 26 통과 (14.53ms, 60.2MB)
테스트 27 통과 (0.03ms, 60MB)
테스트 28 통과 (16.49ms, 60.5MB)
테스트 29 통과 (14.21ms, 60.2MB)
테스트 30 통과 (11.96ms, 61.7MB)
테스트 31 통과 (12.74ms, 62.3MB)
테스트 32 통과 (12.85ms, 59.5MB)
테스트 33 통과 (13.37ms, 60.3MB)
테스트 34 통과 (14.05ms, 59.5MB)
테스트 35 통과 (16.35ms, 59.1MB)
테스트 36 통과 (16.80ms, 59.7MB)
테스트 37 통과 (0.02ms, 60.7MB)
테스트 38 통과 (15.09ms, 60.4MB)
테스트 39 통과 (16.17ms, 61.2MB)
테스트 40 통과 (0.03ms, 61.8MB)
테스트 41 통과 (14.19ms, 60.6MB)
테스트 42 통과 (13.49ms, 59.4MB)
테스트 43 통과 (13.54ms, 62.1MB)
테스트 44 통과 (0.02ms, 62MB)
테스트 45 통과 (13.01ms, 61.1MB)
테스트 46 통과 (11.56ms, 59.6MB)
테스트 47 통과 (13.12ms, 59.7MB)
테스트 48 통과 (17.94ms, 60.1MB)
테스트 49 통과 (14.65ms, 60.9MB)
테스트 50 통과 (0.02ms, 59.8MB)
테스트 51 통과 (19.37ms, 59.3MB)
테스트 52 통과 (18.01ms, 60.4MB)
테스트 53 통과 (0.03ms, 63.2MB)
테스트 54 통과 (0.02ms, 62.2MB)