Search
Duplicate

배열 돌리기 1

주차
14
문제번호
16926
언어
C++
티어
실버
유형
구현
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

Memo

4 X 4 배열을 기준으로 설명 드리겠습니다.
배열 시작 위치
시작 위치는 0,0 이고, 가장 마지막은 N - 1, M - 1입니다.
start_y, start_x, end_y, end_x 초기화
시작 위치를 초기화 해줍니다. 사각형으로 진행되기 때문에 대각선 방향의 좌표를 저장했습니다.
start_x = 0; start_y = 0; end_x = M - 1; end_y = N - 1;
C++
복사
rotate_operation 함수
start_y, start_x, end_y, end_x를 기준으로 위의 그림과 같은 작업을 반복합니다.
void rotate_operation(int s_y, int s_x, int e_y, int e_x) { int tmp, tmp2; tmp2 = g_map[s_y][s_x]; for (int i = s_y ; i < e_y ; i++) { tmp = g_map[i + 1][s_x]; g_map[i + 1][s_x] = tmp2; tmp2 = tmp; } for (int j = s_x ; j < e_x ; j++) { tmp = g_map[e_y][j + 1]; g_map[e_y][j + 1] = tmp2; tmp2 = tmp; } for (int i = e_y ; i > s_y ; i--) { tmp = g_map[i - 1][e_x]; g_map[i - 1][e_x] = tmp2; tmp2 = tmp; } for (int j = e_x ; j > s_x ; j--) { tmp = g_map[s_y][j - 1]; g_map[s_y][j - 1] = tmp2; tmp2 = tmp; } }
C++
복사
start_y, start_x, end_y, end_x 위치 이동
이동 시키는 작업은 두 점들이 교차하기 직전까지 반복됩니다.
while (start_x < end_x && start_y < end_y)
C++
복사

Code

제출 날짜

@4/2/2021

메모리

2372 KB

시간

88 ms
#include <iostream> #define endl "\n" int N, M, R; int g_map[301][301]; void input_faster() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } void input() { input_faster(); std::cin >> N >> M >> R; for (int i = 0 ; i < N ; i++) for (int j = 0 ; j < M ; j++) std::cin >> g_map[i][j]; } void rotate_operation(int s_y, int s_x, int e_y, int e_x) { int tmp, tmp2; tmp2 = g_map[s_y][s_x]; for (int i = s_y ; i < e_y ; i++) { tmp = g_map[i + 1][s_x]; g_map[i + 1][s_x] = tmp2; tmp2 = tmp; } for (int j = s_x ; j < e_x ; j++) { tmp = g_map[e_y][j + 1]; g_map[e_y][j + 1] = tmp2; tmp2 = tmp; } for (int i = e_y ; i > s_y ; i--) { tmp = g_map[i - 1][e_x]; g_map[i - 1][e_x] = tmp2; tmp2 = tmp; } for (int j = e_x ; j > s_x ; j--) { tmp = g_map[s_y][j - 1]; g_map[s_y][j - 1] = tmp2; tmp2 = tmp; } } void solve() { int start_x, start_y, end_x, end_y; while(R--) { start_x = 0; start_y = 0; end_x = M - 1; end_y = N - 1; while (start_x < end_x && start_y < end_y) { rotate_operation(start_y, start_x, end_y, end_x); start_x++; start_y++; end_x--; end_y--; } } } void print_val() { for (int i = 0 ; i < N ; i++) { for (int j = 0 ; j < M ; j++) std::cout << g_map[i][j] << " "; std::cout << endl; } } int main() { input(); solve(); print_val(); return (0);
C++
복사