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 |