영어 읽기
링크: 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)
}
}
}
}