본문 바로가기

Algorithm/level2

[ 프로그래머스 - Kotlin ] 삼각 달팽이 ( 코틀린 )

728x90

( 월간 코드 챌린지 시즌1 / 삼각 달팽이 )

[문제]

문제 설명

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

제한사항

  • n은 1 이상 1,000 이하입니다.

입출력 예시

n result
4 [1,2,9,3,10,8,4,5,6,7]
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]
6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

[풀이]

n과 등차수열의 합 공식을 통해서 삼각형 배열의 최댓값을 구합니다. (현재 상황에서의 등차수열의 합 공식 : n * (n + 1) / 2)

상 하 좌 우 에 대하여 인덱스로 사용할 변수 top, bottom, left, right를 설정합니다.

왼쪽변 -> 오른쪽 변 -> 왼쪽 변과 같은 순서로 삼각형 배열을 채워나가면 됩니다.


[코드]

class Solution {
    fun solution(n: Int): IntArray {
        var top = 0
        var left = 0
        var bottom = n - 1
        var right = n - 1
        var num = 1
        var idx = 0
        // 등차수열의 합 공식으로 최댓값을 미리 구합니다.
        val max = (n + 1) * n / 2
        val answer = IntArray(max)
        // 삼각형 모양의 2차원 배열 선언
        val arr = Array(n){ IntArray(it + 1) }

        while(num <= max){
            // 왼쪽 변의 숫자 계산
            for(i in top..bottom) arr[i][left] = num++
            if(num > max) break
            // 왼쪽 변에대한 계산이 끝났음으로 다음 왼쪽 벽과 다음 위쪽 벽을 설정
            left++
            top++
            // 밑쪽 변의 숫자 게산
            for(i in left..right) arr[bottom][i] = num++
            if(num > max) break
            // 밑쪽 변에대한 계산이 끝났음으로 다음 밑쪽 벽과 다음 오른쪽 벽을 설정
            bottom--
            right--
            // 오른쪽변은 전체의 길이가 밑에서부터 위로 갈수록 점점 좁아짐으로 idx를 감소시키면서 오른쪽 변의 숫자 계산
            idx = right
            for(i in bottom downTo top) arr[i][idx--] = num++
            if(num > max) break
            // 오른쪽 변에대한 계산이 끝났음으로 다음 오른쪽 벽과 다음 위쪽 벽을 설정
            right--
            top++
        }

        idx = 0
        // 위에서부터 결과를 answer에 저장
        arr.forEach{ i -> i.forEach{ answer[idx++] = it } }

        return answer
    }
}

문제 링크

 

코딩테스트 연습 - 삼각 달팽이

5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

programmers.co.kr

제가 잘못 알고 있거나 잘못된 부분이 있을 경우 알려주시고 추가로 궁금한 점 있으신 분들도 댓글이나 메일 주시면 성실히 답변해 드리겠습니다.🧑🏻‍💻

감사합니다~😄

728x90