[LeetCode] 54. Spiral Matrix, Medium

2025. 3. 11. 17:22·CodingTest/LeetCode
반응형

1. 문제

  • m x n 크기의 2차원 배열이 주어질 때, 그림과 같이 탐색하여 요소를 순서대로 담은 배열을 반환하라.

2. 풀이

function spiralOrder(matrix: number[][]): number[] {
    
    let i = 0, j = 0; // i, j 인덱스
    let m = matrix.length, n = matrix[i].length; // 배열 크기.
    
    const result = []; // 결과를 담을 배열.
    
    let dir: 'right' | 'down' | 'left' | 'up' = 'right'; // matrix 방향 정보.
    
    while(result.length < m * n) { // 배열이 가득찰 때 까지 반복.
        result.push(matrix[i][j]);
        matrix[i][j] = -101; // 문제에서 제공되는 정수 범위를 벗어나서 아무거나 지정.
        
        if(dir === 'right') {	// 오른쪽인 경우,
            if(j !== n-1 && matrix[i][j+1] !== -101) { // j가 마지막 인덱스가 아니고, 방문한 적 없다면 
                j++; // j 증가.
            } else { // j가 마지막 요소 또는 방문한 적 있는 요소라면 
                dir = 'down'; // down 방향 전환
                i++; // i증가.
            }
        } else if(dir === 'down') {
            if(i !== m-1 && matrix[i+1][j] !== -101) {
                i++;
            } else {
                dir = 'left';
                j--;
            }
        } else if(dir === 'left') {
            if(j !== 0 && matrix[i][j-1] !== -101) {
                j--;
            } else {
                dir = 'up';
                i--;
            }
        } else if(dir === 'up') {
            if(i !== 0 && matrix[i-1][j] !== -101) {
                i--;
            } else {
                dir = 'right';
                j++;
            }
        }
    }
    
    return result;
    
};
  • 메인 컨셉은 요소의 방문 여부를 알고, 방향을 전환하는 것이라고 생각했다. 겉이야 끝에 도달했는지로 판단하면 되지만, 안에 있는 애들은 언제 방향을 전환해야 하는 지 모른다.
  • 이걸 위해서 방문했던 요소를 다른 값으로 변경시키는 방식을 사용했다.
  • 처음에는 두 번째 예제를 고려하지 않아서 애가 겉은 잘 도는데 안을 안돌아서 방법을 바꿨다.
  • 위치와 상관없이 방향 정보와 범위를 고려해서 인덱스를 이동시킨다. 
  • right 설명만 적긴 했는데, 나머진 똑같다.
  • -101은 큰 의미가 없고 그냥 배열에 담길 수 있는 요소의 범위가 -100 <= x <= 100 이기 때문에 이 범위만 벗어나면 상관없다.
  • 처음에는 0으로 체크했다가 테스트 케이스 실패..
저작자표시 (새창열림)
'CodingTest/LeetCode' 카테고리의 다른 글
  • [LeetCode] 67. Add Binary, Easy
  • [LeetCode] 118. Pascal's Triangle, Easy
  • [LeetCode] 498. Diagonal Traverse, Medium
  • [LeetCode] 66. Plus One, Easy
뜸부깅
뜸부깅
코딩에 대한 여러 개인적인 생각을 정리하고 공부를 하는 공간입니다!!
  • 뜸부깅
    코오오딩
    뜸부깅
  • 전체
    오늘
    어제
    • Note (429)
      • Skill (31)
        • Java & Spring (9)
        • Javascript & HTML & CSS (0)
        • React (0)
        • Next.js (22)
      • CodingTest (389)
        • 백준 온라인 저지(BOJ) (140)
        • 프로그래머스(Programmers) (79)
        • LeetCode (170)
      • Algorithm & Data Structure (6)
      • [Project] 포트폴리오 (3)
        • Front end (3)
        • Back end (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Easy
    백준1427
    TypeScript
    백준1260
    boj1427
    백준
    BOJ
    알고리즘
    meidum
    boj2108
    component-scan
    medium
    next 14
    백준7576
    프로그래머스
    백준2751
    leetcode 2236
    백준7576자바
    Java
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
뜸부깅
[LeetCode] 54. Spiral Matrix, Medium
상단으로

티스토리툴바