Boj 16927) 배열 돌리기 2 Home / Posts / Algorithm / Boj-gold / 4 분 소요 문제 백준 16927 설명 회전은 중심으로 부터 거리가 같은 원소들이 이루는 직사각형에서 이루어진다. 이는 min(n, m)/2 개 만큼 존재한다. 중심으로부터 거리가 먼 곳부터 차례대로 회전시킨다. 이때 회전의 편의성을 위해 같은 회전 직사각형의 원소들을 선형으로 묶어서 한번에 계산했다. 시간 복잡도 O(\(\mathrm{N}\mathrm{M}\)) 코드 int arr[301][301]; int n, m, r; vector<int*> linears; vector<int> copys; void Linearize(int p = 0) { if (p << 1 >= min(n, m)) return; for (int i = p; i < n - p - 1; i++) linears.push_back(&arr[i][p]); for (int i = p; i < m - p - 1; i++) linears.push_back(&arr[n-p-1][i]); for (int i = n - p - 1; i > p; i--) linears.push_back(&arr[i][m-p-1]); for (int i = m - p - 1; i > p; i--) linears.push_back(&arr[p][i]); for (int* i : linears) copys.push_back(*i); int total = linears.size(); int j = (total - r % total) % total; for (int i = 0; i < total; i++) { *linears[i] = copys[j++]; if (j == total) j = 0; } linears.clear(); copys.clear(); Linearize(p + 1); } int main() { cin >> n >> m >> r; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) cin >> arr[i][j]; Linearize(); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cout << arr[i][j] << ' '; cout << '\n'; } } 이전 다음 댓글남기기
댓글남기기