문제
https://www.acmicpc.net/problem/16926
접근방법
n과 m 중 작은 값을 2로 나눈 값(min(n, m) / 2)만큼 for문을 돌렸다.
loop 안에서 각각의 회전의 while문 4개로 구현했다.
코드
int n, m, r;
vector<vector<int>> table;
void Rotate() {
int bn = n, bm = m;
for (int i, j, k = 0;k < min(n, m) / 2;k++) {
i = k; j = k;
//아래쪽으로 이동, bowlA : 입력해야할 전 값, bowlB : 저장해야할 이번 값.
int bowlA = table[i][j];
int bowlB;
while(i + 1 < bn) {
bowlB = table[i+1][j];
table[i+1][j] = bowlA;
bowlA = bowlB; //이번에 저장한 값은 다음 번에 들어갈 값임.
i++;
}
//우측으로 이동, bowlA는 현재 왼쪽 맨 아래 값임.
while(j + 1 < bm) {
bowlB = table[i][j+1];
table[i][j+1] = bowlA;
bowlA = bowlB; //이번에 저장한 값은 다음 번에 들어갈 값임.
j++;
}
//위로 이동, bowlA는 현재 오른쪽 맨 아래 값
while(i - 1 >= k) {
bowlB = table[i-1][j];
table[i-1][j] = bowlA;
bowlA = bowlB; //이번에 저장한 값은 다음 번에 들어갈 값임.
i--;
}
//왼쪽으로 이동
while(j - 1 >= k) {
bowlB = table[i][j-1];
table[i][j-1] = bowlA;
bowlA = bowlB; //이번에 저장한 값은 다음 번에 들어갈 값임.
j--;
}
bn--; bm--;
}
}
int main() {
cin >> n >> m >> r;
table = vector<vector<int>>(n, vector<int>(m));
FOR(i, n) FOR(j, m) cin >> table[i][j];
while(r--) Rotate();
FOR(i, n) {FOR(j, m) cout << table[i][j] << " "; cout << endl;}
return 0;
}
개선할 점
같은 문제를 dy, dx를 써서 dfs로 구현한 코드도 많이 볼 수 있었다.
그래프 문제 나올 때는 dy, dx를 항상 고려해보자.
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준 1713] - 후보 추천하기 C++ (0) | 2024.03.20 |
---|---|
[백준 16918] - 봄버맨(구현) C++ (0) | 2024.03.20 |
[백준 18111] - 마인크래프트(구현) C++ (1) | 2024.03.20 |
[백준 13460] - 구슬 탈출 2(BFS) C++ (1) | 2024.03.19 |
[백준 16234] - 인구 이동(bfs) C++ (0) | 2024.03.19 |