백준

백준 1157번. 단어 공부

닉네임못짓는사람 2022. 1. 20. 13:40
반응형

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

 

1157번: 단어 공부

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

www.acmicpc.net

자세한 내용은 위 링크에서 직접 확인해보도록 하자.

 

풀이


import java.util.*

fun main() {
    val input = Scanner(System.`in`)

    val s = input.next().toUpperCase()
    var max = 0
    var res = ' '

    for(i in s){
        val cnt = s.count{it == i}

        if(max < cnt){
            max = cnt
            res = i
        }else if(max == cnt && res != i){
            res = '?'
            break
        }
    }
    println(res)
}

 

일단 문제에서 대소문자를 구분하지 않는다고 했으니 모든 uppercase를 사용해서 모두 대문자로 바꿔준다.

 

그 후 문자열을 for문으로 loop하면서 각 문자들의 갯수를 새주도록 하였는데,

위와 같이 시간 초과가 발생했다.

아마도 for문 내에서 count함수를 사용했기 때문이라고 생각된다.

 

그래서 아래와 같은 방법으로 변경했다.

import java.util.*

fun main() {
    val input = Scanner(System.`in`)

    val s = input.next().toUpperCase()
    var max = 0
    var res = ' '
    var arr = Array(26, {0})

    for(i in s){
        arr[i.toInt() - 65] += 1
    }

    for(i in 0 .. arr.lastIndex){
        if(max < arr[i]){
            max = arr[i]
            res = (i + 65).toChar()
        }else if(max == arr[i] && max != 0){
            res = '?'
        }
    }
    println(res)
}

먼저 a~z알파벳의 갯수가 들어갈 크기 26의 배열을 선언해준다.

for문에서는 문자열에서 알파벳이 등장할 때 마다 배열에 있는 해당 알파벳의 위치에 갯수를 하나씩 더해준다.

 

이렇게 알파벳의 갯수를 모두 카운팅 한 뒤, 배열을 for문으로 돌면서 가장 많은 알파벳의 갯수를 세어주면 끝이다.

반응형