꽤 오랜만의 게시인 것 같다.
그동안 코틀린 문법공부를 좀 다시 하느라 문제를 풀어보지 못하였는데 다시 천천히 시작하려고 한다.
오늘은 문자열 문제중 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 |
댓글