본문 바로가기
스터디(beakjoon)

Kotlin] 백준 1157번 문제풀이

by 김마리님 2023. 6. 8.

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

 

풀이

더보기

(이 문제는 내가 짠 식이 시간복잡도 상 최적의 효율이라 생각되지 않는다 ;ㅅ; )

 

먼저 입력받은 문자열이 대소문자를 구분하지 않으므로, 그리고 대문자 출력을 원했으므로 upperCase()를 통해 대문자로 치환한다. 그리고 알파벳 별로 띄워놓기 위해 .toCharArray()를 통해 배열로 전환한다.

그리고 distinct()를 통해 겹치는 요소를 삭제한다.

 

그리고 반복문을 돌리기 전에 최고값을 파악하고, 이 때의 문자를 저장해 줄 두 변수를 선언한다(maxCount, maxChar). 

겹치는 요소가 삭제된 배열을 forEach문을 통해 반복한다. 이 때 기존의 배열에서 일치하는 char의 갯수만 카운트 하도록 count { it == 현재 forEach의 it값 } 을 한다.

그리고 이 카운트와 for문 외부에서 선언해둔 maxCount를 비교한다.

이 때 두 값이 같다면 maxChar만 "?" 로 변경하고, count가 maxCount보다 크다면 maxCount도 count로 갱신하고 문자열도 g현재 forEach의 it 값으로 대체한다. 약간..max() 함수의 작동방식과 유사하다.

 

import kotlin.math.max

fun main(args: Array<String>) {
    question1157()
}

fun question1157() {

    var maxCount = 0
    var maxChar = ""

    var word = readLine()!!.uppercase().toCharArray()
    var wordDistinct = word.distinct()

    wordDistinct.forEach {
        var count = word.count { wordChar -> wordChar == it }

        if(maxCount == count) {
            maxChar = "?"
        } else if(maxCount < count) {
            maxCount = count
            maxChar = it.toString()
        }
    }

    println(maxChar)
}
반응형