풀이
김영준
function solution(n) { let row = 0; let col = 0; let value = 1; const arr = []; for(let i = 0 ; i < n ; i ++) arr.push([]); let startRow = 0; let startCol = 0; let endRow = n - 1; let endCol = n - 1; while(value <= n * n){ for(let i = startCol; i <= endCol; i++){ arr[startRow][i] = value++; } startRow++; for(let i = startRow; i <= endRow; i++){ arr[i][endCol] = value++; } endCol--; for(let i = endCol; i >= startCol; i--){ arr[endRow][i] = value++; } endRow--; for(let i = endRow; i >= startRow; i--){ arr[i][startCol] = value++; } startCol++; } return arr; }
이종현
function solution(n) { const move = [[0, 1], [1, 0], [0, -1], [-1, 0]]; const answer = Array.from(Array(n), () => Array(n).fill(0)) let x = 0, y = 0, dir = 0, num = 1; while(num <= n**2) { answer[x][y] = num; let nextX = x + move[dir][0]; let nextY = y + move[dir][1]; if (nextX >= n || nextX < 0 || nextY >= n || nextY < 0 || answer[nextX][nextY] !== 0) { dir = (dir + 1) % 4; nextX = x + move[dir][0]; nextY = y + move[dir][1]; } x = nextX; y = nextY; num++; } return answer; }
박노철
function solution(n) { // 만약 4이면 /* [[ 1, 2, 3, 4], [12,13,14, 5], [11,16,15, 6], [10, 9, 8, 7]] 5이면 [[ 1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]] dfs로 각 배열을 채워준다. */ const dx=[1, 0, -1, 0]; const dy=[0, 1, 0,-1]; const visited=Array.from({length:n},()=>Array.from({length:n },()=>0)); const answer=Array.from({length:n},()=>Array.from({length:n },()=>1)); // 스타트 지점을 위해 1로 채운다. let d =0 // 막히면 방향을 바꿔서 간다. const limit=n*n+1; function DFS(num,cur){ if(num==limit){ return; }else{ const [curX, curY]=cur; answer[curY][curX]=num; const [nextX, nextY]=[curX+dx[d], curY+dy[d]]; if(nextX<n && nextX>=0 && nextY>=0 && nextY<n&& visited[nextY][nextX]===0){ visited[nextY][nextX]=1; DFS(num+1, [nextX, nextY]); }else{ //막혔을때 방향전환을 위해 d=(d+1)%4; const [nx,ny]=[curX+dx[d], curY+dy[d]]; if(nx<n && nx>=0 && ny<n && ny>=0 && visited[ny][nx]===0){ visited[ny][nx]=1; DFS(num+1, [nx, ny]); }else return; } } } visited[0][0]=1; DFS(1, [0,0]); return answer }
이민희
/* 우: i, j + 1 (j가 n - 1, i가 0일 때 아래로) 하: i + 1, j (i가 n - 1, j가 n - 1일 때 좌측으로) 좌: i, j - 1 (j가 0, i가 n - 1일 때 위로) 상: i - 1, j (i가 0, j가 0일 때 우측으로) */ function dfs(graph, row, col, direction, n, cur) { if (row < 0 || row >= n || col < 0 || col >= n || graph[row][col] !== 0) { return; } graph[row][col] = cur; if (direction === '우') { if (col + 1 < n && !graph[row][col + 1]) { dfs(graph, row, col + 1, direction, n, cur + 1) } else { dfs(graph, row + 1, col, '하', n, cur + 1) } } else if (direction === '하') { if (row + 1 < n && !graph[row + 1][col]) { dfs(graph, row + 1, col, direction, n, cur + 1) } else { dfs(graph, row, col - 1, '좌', n, cur + 1) } } else if (direction === '좌') { if (col - 1 >= 0 && !graph[row][col - 1]) { dfs(graph, row, col - 1, direction, n, cur + 1) } else { dfs(graph, row - 1, col, '상', n, cur + 1) } } else if (direction === '상') { if (row - 1 >= 0 && !graph[row - 1][col]) { dfs(graph, row - 1, col, direction, n, cur + 1) } else { dfs(graph, row, col + 1, '우', n, cur + 1) } } return graph; } function solution(n) { const result = Array.from({ length: n }, () => Array(n).fill(0)); return dfs(result, 0, 0, '우', n, 1); }
박건우
function solution(n) { const answer = Array(n).fill().map(() => Array(n).fill(0)); const d = [[0, 1], [1, 0], [0, -1], [-1, 0]]; // 2차원 배열 문제에서 많이 쓰이는 기법입니다. 순서대로 오른쪽, 아래, 왼쪽, 위 방향 let direction = 0; let [y, x] = [0, 0]; // 시작 좌표 let cnt = 0; // 방문한 타일 개수 while(cnt < n * n){ answer[y][x] = ++cnt; let [dy, dx] = d[direction % 4]; let [ny, nx] = [y + dy, x + dx]; // 만약 배열 범위 밖을 벗어나거나, 이미 방문한 배열이라면 if(ny >= n || ny < 0 || nx >= n || nx < 0 || answer[ny][nx]){ direction += 1; //방향을 바꿔줍니다. [dy, dx] = d[direction % 4]; [ny, nx] = [y + dy, x + dx]; } [y, x] = [ny, nx]; } return answer; }
박주연
반복문, 조건문을 사용해서 구현했는데 개인적으로는 마음에 안드네요😥 더 효율적이고 좋은 방법이 있다면 참고하겠습니다!
function solution(n) { const arr = Array.from(new Array(n), () => new Array(n).fill(0)); let val = 1; // 배열에 넣을 값 let direction = 0; // 이동방향: 0(오른쪽), 1(아래), 2(왼쪽), 3(위) let row = 0; // 행 let col = 0; // 열 while(val <= n*n){ arr[row][col] = val++; // 미리 값을 넣고 ++ switch(direction){ case 0: if(col === n-1 || arr[row][col+1] !== 0){ //열의 끝일 경우 + 이미 값이 있을 경우 direction = 1; row++; }else{ col++; } break; case 1: if(row === n-1 || arr[row+1][col] !== 0){ //행의 끝일 경우 + 이미 값이 있을 경우 direction = 2; col--; }else{ row++; } break; case 2: if(col === 0 || arr[row][col-1] !== 0){ // 열이 0일 경우 + 이미 값이 있을 경우 direction = 3; row--; }else{ col--; } break; case 3: if(row === 0 || arr[row-1][col] !== 0){ // 행이 0일 경우 + 이미 값이 있을 경우 direction = 0; col++; }else{ row--; } break; } } return arr; }