영어 읽기

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

 

1501번: 영어 읽기

첫째 줄에 사전에 있는 단어들의 개수 N(0 ≤ N ≤ 10,000)이 주어진다. 다음 N개의 줄에는 각 줄에 하나씩, 영어 사전에 있는 단어들이 주어진다. 각 단어의 길이는 100자를 넘지 않는다. 다음 줄에

www.acmicpc.net

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

 

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)
            }
        }
    }
}

'ProblemSolving' 카테고리의 다른 글

[BOJ] 1245_농장 관리  (0) 2022.05.15
[BOJ] 1094_막대기  (0) 2022.05.14
[BOJ] 1417 국회의원 선거  (0) 2022.05.12
[BOJ] 1010_다리 놓기 재해결  (0) 2022.05.11
[BOJ] 1377_버블 소트  (0) 2021.03.14
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기