코딩 테스트 연습 - Pascal's Triangle

다용도리모콘·2020년 9월 17일
0

CodingTest

목록 보기
20/34

01. 이해

주어진 숫자의 행만큼의 파스칼 삼각형을 2차원 배열로 반환하라.
   

02. 계획

행이 증가할 수록 행의 길이는 1씩 증가하고 행의 첫번째와 마지막 숫자는 1이다.
첫번째와 마지막을 제외한 인덱스 n에 위치한 숫자는 이전 행의 n-1,n 인덱스의 합이다.
첫번째 행은 이전 행이 없으므로 예외처리 해야 함. 

03. 실행

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

04. 회고

오랜만에 알고리즘 문제를 풀었다.
코틀린도 거의 두 달 만에 써보는 거라 문제 자체보다 코틀린 함수들이 생각나지 않아서 구글링 하는데 시간이 더 오래 걸렸다.
코틀린의 collection 함수들을 쓰면 더 깔끔하게 풀 수 있을 것 같은데 전혀 생각이 나질 않는다.
reduce, fold, map... 이직 준비 하려면 다시 익숙해질 수 있게 연습해야 겠다.
문제 내용에 관해선 삼각형의 행별로 좌우 대칭이기 때문에 앞쪽 인덱스에서는 연산을 통해 값을 구하고 뒤쪽 인덱스는 복제하는 방식을 썼는데 괜찮을 거 같다.

0개의 댓글