주어진 숫자의 행만큼의 파스칼 삼각형을 2차원 배열로 반환하라.
행이 증가할 수록 행의 길이는 1씩 증가하고 행의 첫번째와 마지막 숫자는 1이다.
첫번째와 마지막을 제외한 인덱스 n에 위치한 숫자는 이전 행의 n-1,n 인덱스의 합이다.
첫번째 행은 이전 행이 없으므로 예외처리 해야 함.
fun generate(numRows: Int): List<List<Int>> {
if (numRows == 0) {
return listOf()
}
if (numRows == 1) {
return listOf(listOf(1))
}
val initList = intArrayOf(1)
val resultList = ArrayList<List<Int>>()
var preRowList = initList
resultList.add(initList.toList())
for (i in 1 until numRows ) {
val row = ArrayList<Int>()
for (j in 0 until round((i/2).toFloat()).toInt() + 1) {
if (j == 0 || j == i) {
row.add(1)
} else {
row.add(preRowList[j - 1] + preRowList[j])
}
}
if (i.rem(2) != 0) {
row.addAll(row.reversed())
} else {
row.addAll(row.subList(0, row.size -1).reversed())
}
resultList.add(row)
preRowList = row.toIntArray()
}
return resultList.toList()
}
오랜만에 알고리즘 문제를 풀었다.
코틀린도 거의 두 달 만에 써보는 거라 문제 자체보다 코틀린 함수들이 생각나지 않아서 구글링 하는데 시간이 더 오래 걸렸다.
코틀린의 collection 함수들을 쓰면 더 깔끔하게 풀 수 있을 것 같은데 전혀 생각이 나질 않는다.
reduce, fold, map... 이직 준비 하려면 다시 익숙해질 수 있게 연습해야 겠다.
문제 내용에 관해선 삼각형의 행별로 좌우 대칭이기 때문에 앞쪽 인덱스에서는 연산을 통해 값을 구하고 뒤쪽 인덱스는 복제하는 방식을 썼는데 괜찮을 거 같다.