본문 바로가기

Programmers

[Programmers] 삼각달팽이 - kotlin

삼각달팽이 (Level2)

link - 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

 

1. 문제 파악하기

- 입력 : 삼각형 한변의 길이 n

- 출력 : 한변의 길이가 n인 정삼각형을 달팽이 처럼 내부로 들어가는 규칙으로 그린후 순서대로 출력한다 (설명하기가 좀 어렵다..)

    1
   2 9
  3 10 8
 4 5 6 7

이런경우 출력은  {1, 2, 9, 3, 10, 8, 4, 5, 6 ,7}

 

2. 아이디어

- n * n의 배열을 생성한다 

- 순서대로 방향을 바꿔가며 숫자를 넣는다 (↓ ,  →,  ↖)

1
2 9
3 10 8
4 5 6 7

- 그리고 위부터 순서대로 읽어서 출력한다

 

3. 풀이

 

class Solution {
    var map = Array<Array<Int>>(1) {Array<Int>(1){-1}}
    var dir = arrayOf(arrayOf(10), arrayOf(01), arrayOf(-1-1))
    fun solution(n: Int): IntArray {
        var answer = ArrayList<Int>()
        map = Array<Array<Int>>(n) {Array<Int>(n){-1}}
        map[0][0= 1
        var num = 2
        var d = 0
        var cX = 0
        var cY = 0
        while(true) {
            var nX = cX + dir[d][0]
            var nY = cY + dir[d][1]
            if (nX < 0 || nY < 0 ||nX >= n || nY >= n || map[nX][nY] != -1) {
                // ㅂㅏㅇㅎㅑㅇ ㅌㅡㄹㄱㅣ
                d = (d+1)%3
                // next ㄱㅓㅁㅅㅏ
                var tX = cX + dir[d][0]
                var tY = cY + dir[d][1]
                if (tX < 0 || tY < 0 || tX >= n || tY >= n || map[tX][tY] != -1) {
                    break
                }
            } else {
                map[nX][nY] = num++
                cX = nX
                cY = nY
            }
        }
        
        map.map { a -> 
            a.map { v ->
                if(v != -1) {
                    answer.add(v)
                }
            }
        }
        
        
        return answer.toIntArray()
    }
}
cs