티스토리 뷰

문제설명은 더보기를 눌러주세요

더보기

문제링크 : programmers.co.kr/learn/courses/30/lessons/68645

문제 설명

정수 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]

 

-풀이-

1. 2차원 어레이를 생성한다

2. 한 번 방향을 회전할 때, 이동하는 거리가 1씩 줄어든다. 
    (n, n-1, n-2, ... 1)

3. 위 -> 아래 / 왼쪽 -> 오른쪽 / 오른쪽 - > (대각선)위
    3가지 경우로 생각해서 푼다.

4. 위 -> 아래는 2차원 배열에서도 위->아래로
    왼쪽 -> 오른쪽은 2차원 배열에서도 왼쪽->오른쪽
    오른쪽 -> (대각선)위는 2차원 배열에서 대각선 이동

 

-코드-

class Solution {
    fun solution(n: Int): IntArray {
        val max = (n*(n+1))/2
        var answer = IntArray(max)
        var arr = Array(n) {IntArray(n)}
        var type = 0
        var cx = 0
        var cy = 0
        var idx = 1
        
        for(i in n downTo 1){
            if(type == 0) { // 위 -> 아래
                for(j in 1..i){
                    arr[cx++][cy] = idx++
                }
                cx-- // 다음 위치 맞춰주기 
                cy++
            } else if(type == 1) { // 왼 -> 오
                for(j in 1..i){
                    arr[cx][cy++] = idx++
                }
                cy-=2
                cx--
            } else { // 오-> 위
                for(j in 1..i){
                    arr[cx--][cy--] = idx++
                }
                cx+=2
                cy++
            }
            type++
            if(type == 3) type = 0
        }
        
        idx = 0
        for(i in 0..n-1){
            for(j in 0..n-1){
                if(arr[i][j] != 0) {
                    answer[idx++] = arr[i][j]
                }
            }
        }
        return answer
    }
    
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday