greenhelix
greenhelix
greenhelix
02-20 12:08
  • All (229)
    • Algorithm (118)
      • Algorithm (17)
      • Graph (0)
      • Core (6)
      • Python (18)
      • PythonSnippet (4)
      • Java (59)
      • Kotlin (14)
    • Project (0)
    • Study (8)
      • License (5)
      • EIP (3)
    • Programming (63)
      • Android (41)
      • Flutter (1)
      • Bugs Life (21)
      • Linux (0)
    • Tech (32)
      • Tech (17)
      • Drone (4)
      • Hacking (11)
    • Life (6)
      • INGRESS (1)
      • 심시티빌드잇 (0)
250x250

티스토리

hELLO · Designed By 정상우.
greenhelix

greenhelix

#59_Code Signal Arcade >> Spiral Numbers
Algorithm/Java

#59_Code Signal Arcade >> Spiral Numbers

2020. 7. 20. 20:00

Code Signal -Arcade

코드시그널

아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당. 
주로 자바 위주로 풀이를 올릴예정이고,

추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...

되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!


SpiralNumbers
회전하는 숫자들

입력값은 n입니다. 이 n을 가지고, n*n의 다차원 배열을 생성하고 그 안에는 1~n까지 시계방향으로 회전하면서 숫자가 들어가는 다차원 배열을 구해달라는 문제입니다. 

 

예시를 보면 확 이해가 됩니다. 

 

그렇다면 이게 코드로는 어떻게 구현할지가 문제입니다. 

 

답안을 보겠습니다.

int[][] spiralNumbers(int n) {
    int [][] bucket = new int[n][n]; 
    int range = n; 
    int start = 0;
    for(int h = 0; h<n; h++){
            //1stream
            int right = 1;
            for(int i = start; i<range; i++){
                if(start != 0){bucket[start][i]= bucket[start][i-1]+right;}
                if(start == 0){bucket[start][i]=bucket[i][start]+right; right++; }
            }
            //2stream
            int down = 1;
            for(int j = start+1; j<range; j++){
                bucket[j][range-1] = bucket[j-1][range-1]+down; 
            }
            //3stream
            for(int x = range-2; x>=start; x--){
                bucket[range-1][x] = bucket[range-1][x+1]+1;
            }
            //4stream
            for(int z = range-2; z>start; z--){
                bucket[z][start] = bucket[z+1][start]+1;
            }
        range -=1;
        start +=1;
    }
return bucket;
}

 저는 총 4가지의 흐름이 있다고 봤습니다. 아래의 그림처럼요.

그래서 코드를 총 네 파트의 반복문으로 분할하고 따로따로 들어가도록 코드를 만들었습니다. 

 

이 컨셉만 이해하셔도 대충 코드가 이해가 되실 겁니다. ㅎㅎ

range 와 Start 는 계속 변경해주면서 실시하면 됩니다. 

 

 


이제 엘리트 분들의 답안을 감상하자... 

 

JAVA

int[][] spiralNumbers(int n) {
    int[][] array = new int[n][n];
    
    int left = 0;
    int right = n - 1;
    int top = 0;
    int down = n - 1;
    
    for (int counter = 1; counter <= n * n; )
    {
        for (int x = left; x <= right; x++)
            array[top][x] = counter++;
        top++;
        
        for (int y = top; y <= down; y++)
            array[y][right] = counter++;
        right--;
        
        for (int x = right; x >= left; x--)
            array[down][x] = counter++;
        down--;
        
        for (int y = down; y >= top; y--)
            array[y][left] = counter++;
        left++;
    }
    
    return array;
}

비슷하네요. 휴 다행. 그래도 뭔가 더 깔끔한건 뭔지 모릅니다. ㅋ 

Python3

def spiralNumbers(n):
    m = [[0] * n for i in range(n)]
    dx, dy = [0, 1, 0, -1], [1, 0, -1, 0]
    x, y, c = 0, -1, 1
    for i in range(n + n - 1):
        for j in range((n + n - i) // 2):
            x += dx[i % 4]
            y += dy[i % 4]
            m[x][y] = c
            c += 1
    return m

역시 파이썬은 이런 작업에는 유용한거 같습니다. 

JS

function spiralNumbers(n) {
    var matrix = [...Array(n)].map(_ => []),
        x = 0,
        y = 0,
        dir = 2,
        size = n,
        c = 0;
    for (var i = 1; i <= n * n; i++) {
        matrix[y][x] = i;
        if (++c == size) {
            dir = (dir + 1) % 4;
            size -= dir % 2;
            c = 0;
        }
        if (dir % 2 == 0) x += dir > 1 ? 1 : -1;
        else y += dir > 1 ? 1 : -1;
    }
    return matrix;
}

 

 

 

공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!

부탁드려요 돈드는거 아니잖아요~

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm > Java' 카테고리의 다른 글

#60_Code Signal Arcade >> Sudoku  (0) 2020.07.21
#58_Code Signal Arcade >> Message From Binary Code  (0) 2020.07.15
#57_Code Signal Arcade >> File Naming  (0) 2020.07.14
    'Algorithm/Java' 카테고리의 다른 글
    • #60_Code Signal Arcade >> Sudoku
    • #58_Code Signal Arcade >> Message From Binary Code
    • #57_Code Signal Arcade >> File Naming
    • #56_Code Signal Arcade >> Digits Product
    greenhelix
    greenhelix
    개발에 관한 것들과 개인적인 것을 담는 블로그

    티스토리툴바