본문 바로가기
BEB/algorithm

23_spiralTraversal

by ddanss 2022. 11. 25.
728x90

[a,b,c]

[d,e,f]

[g,h,i]

이렇게 있으면 abcfihgde 이런식으로 출력해야함

 

 

const spiralTraversal = function (matrix) {
  row = matrix.length;
  col = matrix[0].length;
  let vis =  Array.from(Array(row), () => Array(col).fill(0)) //방문했는지 알려주는 2차원배열
  let res = []; //결과
  let swit = 0; //방향을 나타내주는 변수
  let x = 0; //순회할때 어느 위치부터 순회할지
  let y = 0; //순회할때 어느 위치부터 순회할지
  let temp_x = 0;
  let temp_y = 0;
  for(let i=0;i<row+col;i++) { //row+col번 이상 순회하지 않기때문
    swit = swit%4; //방향이 상하좌우 4방향밖에 없기 때문
    if(swit===0) { //오른쪽 순회
      for(let j=y;j<col;j++) {
        if(vis[x][j]===0) { //방문안했으면
          res.push(matrix[x][j]); //결과 배열에 넣고
          vis[x][j]=1; //방문했다고 해주고
          temp_y = j; //예비y 변수에 넣어줬다가
        }
      }
      y = temp_y; //y변수에 예비y 변수를 넣어줌
    } 
    else if(swit===1) { //아래쪽
      for(let j=x;j<row;j++) {
        if(vis[j][y]===0) {
          res.push(matrix[j][y]);
          vis[j][y]=1;
          temp_x=j;
        }
      }
      x = temp_x;
    }
    else if(swit===2) { //왼쪽
      for(let j=y;j>=0;j--) {
        if(vis[x][j]===0) {
          res.push(matrix[x][j]);
          vis[x][j]=1;
          temp_y=j;
        }
      }
      y = temp_y;
    }
    else if(swit===3) { //위쪽
      for(let j=x;j>=0;j--) {
        if(vis[j][y]===0) {
          res.push(matrix[j][y]);
          vis[j][y]=1;
          temp_x=j;
        }
      }
      x = temp_x;
    }
    swit++; //방향을 바꿔줌
  }
  res = res.join(''); //결과를 문자열로 만들고
  return res; //리턴
};
반응형

'BEB > algorithm' 카테고리의 다른 글

25_robotPath  (0) 2022.11.29
[Javascript] 기수정렬  (0) 2022.11.28
[JavaScript] 배열 회전 (90도,180도,270도)  (0) 2022.11.24
머지소트 병합정렬  (1) 2022.11.22
LPS  (0) 2022.11.21

댓글