본문 바로가기
개발/알고리즘

알고리즘 13 : spiralTraversal, 배열 나선형으로 순회

by 안뇽! 2021. 10. 5.
반응형

 

 

문제

2차원 M x N 배열을 나선형(spiral)으로 순회해야 합니다.

입력

인자 1 : matrix

  • 세로 길이(matrix.length)가 M, 가로 길이(matrix[i].length)가 N인 2차원 배열
  • matrix[i]는 string 타입을 요소로 갖는 배열
  • matrix[i][j].length는 1

출력

  • string 타입을 리턴해야 합니다.

주의사항

  • 순회는 좌측 상단 (0,0)에서 시작합니다.
  • 배열의 모든 요소를 순서대로 이어붙인 문자열을 리턴해야 합니다.

입출력 예시

let matrix = [
  ['A', 'B', 'C'],
  ['D', 'E', 'F'],
  ['G', 'H', 'I'],
];
let output = spiralTraversal(matrix);
console.log(output); // --> 'ABCFIHGDE'

matrix = [
  ['T', 'y', 'r', 'i'],
  ['i', 's', 't', 'o'],
  ['n', 'r', 'e', 'n'],
  ['n', 'a', 'L', ' '],
];
output = spiralTraversal(matrix);
console.log(output); // --> 'Tyrion Lannister'

 

코드

const spiralTraversal = function (matrix) {
  // TODO: 여기에 코드를 작성합니다.
  //
  let result = ''
  function goAround (list){
    let len = list[0].length;
    if(len === 1){
      list[0].forEach(el=>result+=el)
      return result
    }
    if(len === 2){
      list[0].forEach(el=>result+=el)
      if(list.length>1){
        list.slice(1).forEach(el=>result+=el[1])
        list.slice(1).forEach(el=>result+=el[0])
      }
      return result
    }
    if(len > 2){
      //to right
      list[0].forEach(el=>result+=el)
      //to down
      	//list=[['b','a','c','k']]일 경우 역순인 kcab이 result에 추가되지 않도록 바로 리턴한다.
      if(list.length===1) return result
        
      for(let j = 1;j<list.length;j++){
        result+=list[j][list[j].length-1]
      }
      //to left
      for(let k = list[0].length-2;k>0;k--){
        result+=list[list.length-1][k]
      }
      //to up
      for(let m = list.length-1;m>0;m--){
        result+=list[m][0]
      }
    }
    //reset list for next loop
    let temp = list.slice();
    temp.shift();
    temp.pop();
    temp = temp.map(el=>el.slice(1,-1))
    
    //return result+=goAruond(temp)하지 않는 이유는 그렇게 하게 되면 result가 중복되어 적힌다.
    //클로저 규칙에 의해서 goAround()안에서 빈문자열 result에 글자들이 채워져 마지막에 리턴된다.
    return goAround(temp)
  };
  
  return goAround(matrix)
};
반응형

'개발 > 알고리즘' 카테고리의 다른 글

알고리즘 15 [Greedy] 편의점 알바  (0) 2021.10.06
알고리즘 14 : [Greedy] 짐 나르기  (0) 2021.10.06
알고리즘 12 : 배열 회전  (0) 2021.10.02
알고리즘 11 : BFS 트리  (0) 2021.10.01
알고리즘 10 : 프린터  (0) 2021.09.21