배열을 회전시킬 때, 끊어가며 돌리는 것보다 꺾이는 점만 체크해주면 좋다는 것을 새롭게 배웠습니다.
아래의 문제를 처음에 풀 때에는 코드 1처럼 풀면서 삽질도 많이하고 코드의 가독성도 많이 떨어졌는데, 코드 2처럼 변경하니 상당히 간단해졌습니다.
배열 돌리기
//코드1
for(int rotate = 0;rotate<R;rotate++){
int rl = n, cl = m;
startR = 0;
startC = 0;
while(rl-startR>0 && cl-startC>0) {
int r = startR, c = startC;
int temp = data[startR][startC];
for (int i = 0; i < 4; i++) {
if(i == 0){
for(;c<cl-1;c++){
data[r][c] = data[r+dr[i]][c+dc[i]];
}
}
else if(i == 1){
for(;r<rl-1;r++){
data[r][c] = data[r+dr[i]][c+dc[i]];
}
}
else if(i == 2){
for(;c>m-cl;c--){
data[r][c] = data[r+dr[i]][c+dc[i]];
}
}
else if(i == 3){
for(;r>n-rl;r--){
data[r][c] = data[r+dr[i]][c+dc[i]];
}
}
}
data[r+1][c] = temp;
rl -= 1;
cl -= 1;
startR += 1;
startC += 1;
}
}
//코드2
int rotate = n>m? m : n;
for (int i = 0; i < rotate; i++) { // (0, 0), (1,1)
int r = i;
int c = i;
int tmp = data[r][c];
for (int j = 0; j < 4;) {
int nr = dr[j] + r;
int nc = dc[j] + c;
if(nr < i || nr >= N - i || nc < i || nc >= M - i)
j++;
else {
data[r][c] = data[nr][nc];
r = nr;
c = nc;
}
}
data[i + 1][i] = tmp;
}
혼자 연습을 하거나 코딩테스트에서 만났을 때 항상 애를 먹던 부분이 배열을 돌리는 부분인데, 이렇게 정리하고 헷갈리지 않는 방법을 알게되어 앞으로는 빠르고 정확하게 풀 수 있을 것 같습니다.