본문 바로가기
알고리즘 문제 풀이/프로그래머스

프로그래머스 삼각 달팽이 Kotlin (구현)

by 옹구스투스 2021. 12. 10.
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/68645

 

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

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

문제 설명

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


제한사항

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

입출력 예


입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • 문제 예시와 같습니다.

풀이

2021.12.07 - [알고리즘 문제 풀이/백준] - 백준 1913 달팽이 Kotlin (구현)

2021.12.08 - [알고리즘 문제 풀이/백준] - 백준 1952 달팽이2 Kotlin (수학)

2021.12.09 - [알고리즘 문제 풀이/백준] - 백준 1959 달팽이3 Kotlin (수학)

돌아온 달팽이 시리즈~

이번엔 프로그래머스 문제이다.

 

문제의 규칙을 찾아보면,

달팽이의 이동 방향은 하, 우, 왼쪽 대각이 반복되며,

n이 5라고 할 때, 각 방향마다 5,4,3,2,1만큼 이동 가능하다.

이를 구현하면 끝인 간단한 구현 문제이다.

 

코드

class Solution {
    fun solution(n: Int): IntArray {
        val arr = Array(n){IntArray(n)}
        //하, 우, 왼대 방향 반복
        val dir = arrayOf(arrayOf(1,0),arrayOf(0,1),arrayOf(-1,-1))
        //n==5인 경우 각 방향마다 54321만큼 이동
        var moveMax = n
        var r=0
        var c=0
        var curDir = 0
        var num=1
        var moveCnt=0
        while(moveMax!=0){
            arr[r][c] = num++
            moveCnt++
            //해당 방향의 최대 이동횟수 도달하면
            if(moveCnt==moveMax){
                //다음 방향의 최대 이동 횟수 감소
                moveMax--
                //이동 횟수 초기화
                moveCnt=0
                //방향 전환
                curDir++
            }
            r+= dir[curDir%3][0]
            c+= dir[curDir%3][1]
        }
        
        val answer = ArrayList<Int>()
        
        for(i in 0 until n){
            for(j in 0 until n){
                if(arr[i][j]>0)
                    answer.add(arr[i][j])
            }
        }
        return answer.toIntArray()
    }
}

 

반응형

댓글