반응형
문제
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 |