https://school.programmers.co.kr/learn/courses/30/lessons/87390
해당 문제는 문제에 나와있는 애니메이션처럼 직접 2차원 배열을 만든 뒤 이를 분리해 1차원 배열로 만들어서 풀게 되면 시간 초과로 인해 통과할 수 없었다. 때문에 규칙을 찾아 각 칸에 올 숫자를 찾아내야 했다.
1) 위와 같이 각 칸에 대해 인덱스를 가지고 있는 3 * 3의 행렬이 있다고 할 때,
2번 칸의 좌표는 다음과 같다.
y좌표 : 2 / 3 = 0
x좌표 : 2 % 3 = 2
= (0, 2)
즉, n * n 행렬에서 m번 칸의 좌표는 다음과 같다.
y좌표 : m / n
x좌표 : m % n
2) 이제 좌표 값을 알았다면 해당 칸에 올 값을 알아야 하는데, 이는 해당 칸의 좌표 값 중 더 큰 값 + 1이 오게 된다. 2번 칸의 좌표는 (0, 2) 이고, x 좌표의 값인 2가 더 크기 때문에 2번 칸에는 2 + 1인 3이 오게 된다. 즉, 해당 칸에 올 값은 max(y, x) + 1
이 되는 것이다.
#include <bits/stdc++.h>
using namespace std;
vector<int> solution(int n, long long left, long long right)
{
vector<int> result;
for (long long i = left; i <= right; i++) // i : 칸의 인덱스
{
long long y = i / n; // y : 해당 칸 y 좌표
long long x = i % n; // x : 해당 칸 x 좌표
result.push_back(max(y, x) + 1);
}
return result; // 2번 칸 ~ 5번 칸에 오는 값들의 배열
}