• Home
  • About
    • Zzu-h photo

      Zzu-h

      주니어 Android 개발자입니다.

    • Learn More
    • Email
    • Instagram
    • Tistory
    • Github
  • Posts
    • All Posts
    • All Tags
    • All Categories
  • Projects

[BOJ] 1501 영어 읽기

13 May 2022

Reading time ~1 minute

영어 읽기

링크: https://www.acmicpc.net/problem/1501

문제는 크게 어렵지 않다.
하지만 공백 에러 때문에 골머리를 앓았다.


N번째줄 까지 사전에 등록할 문자열을 입력받는다.
이때, 문자열을 저장하는 것이 아니라, 각 인덱스별로 해당 문자열에서 쓰인 문자 개수를 카운팅해서 저장한다.
그리고 앞 뒤 문자를 알아두기 위해 그 배열도 같이 선언해 둔다.


M을 입력받고 이제 각 문장을 공백을 기준으로 슬라이스를 해준다.
그 후 각 단어별로 사전에 등록된 것들을 하나씩 비교해서 교체될 수 있는 것에 카운팅한다.
이때, 사전에 등록했던 방식과 같이 문자 개수를 세서 비교한다.


문장의 각 단어를 일일이 센 후에 이전 카운팅 된값을 곱한다.
이는 경우의 수에서 중복조합의 이유로 곱하는 것이다.


마지막으로 이를 반복하여 함수를 종료한다.

주의: 문자열 입력, 슬라이싱 시에 공백에 대한 처리를 무조건 해주어야 한다!!

  • 정답 코드
class Boj1501 {
    companion object{
        const val arrSize = 10001
        val alpha = Array(arrSize){Array(52){0} }
        var pair = Array(arrSize){ Pair('a', 'a') }

        fun getCharToInt(c: Char): Int
            = if(c.isLowerCase()) c.toInt() - 'a'.toInt() + 26
            else c.toInt() - 'A'.toInt()

        @JvmStatic
        fun main(args: Array<String>){
            val n = readln().toInt()
            for(i in 0 until n){
                val str = readln()
                if(str.isBlank()) continue
                str.forEach { alpha[i][getCharToInt(it)]++ }
                pair[i] = Pair(str.first(), str.last())
            }
            val m = readln().toInt()

            for(i in 0 until m){
                val ts = readln()
                if(ts.isBlank()) continue
                val arr = ts.split(' ')
                var totCount = 1
                arr.forEach {
                    if(it.isBlank()) return@forEach
                    val str = it
                    val inputAlphaArr = Array(52){0}
                    var count = 0
                    str.forEach { inputAlphaArr[getCharToInt(it)]++ }
                    for(t in 0 until n){
                        if(pair[t].first != str.first() || pair[t].second != str.last()) continue
                        var flag = true
                        for(k in 0 until 52)
                            if(inputAlphaArr[k] != alpha[t][k]) {
                                flag = false
                                break
                            }

                        if(flag) count++
                    }
                    totCount *= count
                }

                println(totCount)
            }
        }
    }
}


PSBOJgold문자열 Share Tweet +1