N x N 배열 자르기

2025. 2. 11. 10:20·공부/Code Cata

 

🔎2차원 배열에서 주어진 규칙으로 1차원 배열 만드는 과정 예시

{0, 0} 좌표 1부터 시작해서 주변의 노드를 1씩 더해 채운다

 

1차원 배열로 만든 뒤, left ~ right 요소를 제외하고 삭제

 

 

 

✅ Flood - Fill 알고리즘으로 2차원 배열 세팅 ver

#include <string>
#include <vector>
#include <queue>

using namespace std;

void make_flood(vector<vector<int>>& map, const int& n)
{
    struct Node
    {
        int y, x;
    };
    
    int direct[8][2] = {
        -1,0,
        -1,1,
         0,1,
         1,1,
         1,0,
         1,-1,
         0,-1,
        -1,-1
    };

    queue<Node> q;

    map[0][0] = 1;
    q.push({ 0,0 });

    while (!q.empty())
    {
        Node now = q.front();
        q.pop();

        for (int i = 0; i < 8; ++i)
        {
            int dy = now.y + direct[i][0];
            int dx = now.x + direct[i][1];
            if (dy < 0 || dx < 0 || dy >= n || dx >= n) continue;
            if (map[dy][dx] != 0) continue;

            map[dy][dx] = map[now.y][now.x] + 1;
            q.push({ dy,dx });
        }
    }
}

vector<int> solution(int n, long long left, long long right)
{
    // flood fill 알고리즘으로 map 세팅
    vector<vector<int>> map(n, vector<int>(n, 0));
    make_flood(map, n);

    // 1차원 배열로 변환
    vector<int> answer;
    for (const auto& row : map)
    {
        answer.insert(answer.end(), row.begin(), row.end());
    }

    // left, right 사이의 요소 제외하고 삭제
    answer.erase(answer.begin(), answer.begin() + left);
    answer.erase(answer.begin() + (right - left + 1), answer.end());

    return answer;
}

문제의 입출력 예에서 나오는 케이스들은 통과하였지만, 제한사항의 n값을 확인하지 않고 map을 2차원 배열로 만들었던게 문제가 되었다.
vector<vector<int>> map(n, vector<int>(n, 0)); 크기가 n x n인 2차원 배열을 메모리에 할당하는데, n의 최대값이 10의 7제곱이므로 메모리 사용량이 엄청났던 것이다.
2차원 배열을 메모리에 할당하지 않고, 1차원 배열로 값을 계산해야된다는 것을 확인했다.

 

 

✅ 수정 코드

#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(int n, long long left, long long right) 
{
    vector<int> answer;
    answer.reserve(right - left + 1);  // 메모리 미리 할당

    // left에서 right까지 필요한 값만 바로 계산
    for (long long i = left; i <= right; ++i) {
        int row = i / n;
        int col = i % n;
        answer.push_back(max(row, col) + 1);
    }

    return answer;
}

 

행렬에서 필요한 부분(left ~ right)만 1차원 배열에 직접 채우는 방식으로 재구현

🔎2차원 배열을 1차원 배열로 변환하는 공식

i = row × n + col

여기서 n이 3이라고 가정한다면 아래와 같이 변환할 수 있다.

(0, 0) = 0
(0, 1) = 1
(0, 2) = 2
(1, 0) = 3
(1, 1) = 4
(1, 2) = 5
(2, 0) = 6
(2, 1) = 7
(2, 2) = 8
  • row = i / n: i를 행당 열의 개수 n으로 나누면 몇 번째 행인지 알 수 있다.
  • col = i % n: i를 n으로 나눈 나머지로 몇 번째 열인지를 알 수 있다.

'공부 > Code Cata' 카테고리의 다른 글

의상 / 곱의 법칙(조합론)  (0) 2025.02.17
할인 행사  (0) 2025.02.13
연속 부분 수열 합의 개수 / 모듈러 연산으로 vector size 초과 피하기  (0) 2025.02.06
괄호 회전하기 / stack 사용  (1) 2025.02.06
멀리 뛰기 / 피보나치 수열 활용  (1) 2025.02.05
'공부/Code Cata' 카테고리의 다른 글
  • 의상 / 곱의 법칙(조합론)
  • 할인 행사
  • 연속 부분 수열 합의 개수 / 모듈러 연산으로 vector size 초과 피하기
  • 괄호 회전하기 / stack 사용
동그래님
동그래님
  • 동그래님
    개발자 동그래
    동그래님
  • 전체
    오늘
    어제
    • 분류 전체보기 (210)
      • 공부 (51)
        • Code Cata (50)
      • 내배캠 (151)
        • TIL (50)
        • C++ (37)
        • Unreal Engine (48)
        • GAS(Gameplay Ability System.. (16)
      • Project (7)
        • Gunfire Paragon (5)
        • Arena Fighters (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    동그래님
    N x N 배열 자르기
    상단으로

    티스토리툴바