본문 바로가기
알고리즘/문자열

백준 8958번 OX퀴즈 - kotlin

by 의탕 2020. 11. 4.

꽤 오랜만의 게시인 것 같다.

그동안 코틀린 문법공부를 좀 다시 하느라 문제를 풀어보지 못하였는데 다시 천천히 시작하려고 한다.

오늘은 문자열 문제중 OX문제를 풀어보았다

문제

O는 정답이고 연속해서 맞출경우 배점이 증가 틀리면 다시 0부터 점수를 얻고 그 점수의 총합을 구하는 문제이다.

접근방법

생각보다 문제가 너무 쉬웠고 1분도 채 안되어서 코드를 생각했고 바로 타자를 두들겼다. (역시 정답률 52%라 그런가)

하지만 문제가 어렵다고 느낄수도 있는 독자를 위해 친절한 설명코드 들어갑니다.

풀이소스

첫 시도만에 답을 맞추긴 했지만 실행시간이 꽤 걸려서 Kotlin 정답자 중 등수가 거의 꼴찌 수준이었다.

첫 시도에서의 코드는

import java.io.BufferedReader
import java.io.InputStreamReader

fun main()=with(BufferedReader(InputStreamReader(System.`in`))) {
    var TC = readLine().toInt()

    repeat(TC){
        val input =readLine().split("").run { subList(1,this.lastIndex) }
        var score = 0
        var sum = 0
        input.forEach{
            if(it=="O") {
                score++
                sum += score
            }else score = 0
        }
        println(sum)
    }
}

이런식으로 input을 readLine으로 받고 또 일일이 나눠주고 리스트화 했다. 그래서 시간이 좀 더 걸린듯 하다.

꼴찌 정도 수준에 올라가있는게 보기싫어서 소스를 수정했고

리스트화 했던 input을 그냥 바로 index로 접근했다.

import java.io.BufferedReader
import java.io.InputStreamReader

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    var TC = readLine().toInt()   //테스트 횟수 입력

    repeat(TC) {//테스트 횟수만큼 반복
        val input = readLine()      //OX 스트링 입력받기
        var score = 0   //배점할 점수
        var sum = 0     //총 점수
        
        //input의 길이만큼 반복
        for (i in 0 until input.length) {
            //input[i]가 O 와 같으면
            if (input[i] == 'O') {
                score++     //점수증가
                sum += score  //총점 더해주기
            } else score = 0  //아니면 점수 다시 0으로
        }
        println(sum)  //답 출력
    }
}

이렇게 바로 index로 접근하여 작성하였고 그 결과로는

코드 길이도 줄고 메모리, 실행 시간 모든 면에서 좋은모습을 보였다.

마침

이번 문제를 통해 코딩테스트의 중요 채점요소에 좀 더 신경쓰면서 코딩해야겠다는 생각을 하게되었다.

'알고리즘 > 문자열' 카테고리의 다른 글

백준 1152번 단어의 개수 - kotlin  (0) 2020.11.04
백준 9012번 괄호 - kotlin  (0) 2020.11.04

댓글