[개발일지]210811_TIL : Comparator,Comparable, 알고리즘 배열 회전

Gooder·2021년 8월 11일
1

개발일지

목록 보기
11/28

JAVA

Comparable vs Comparator

알고리즘

배열을 회전시킬 때, 끊어가며 돌리는 것보다 꺾이는 점만 체크해주면 좋다는 것을 새롭게 배웠습니다.
아래의 문제를 처음에 풀 때에는 코드 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;
}

혼자 연습을 하거나 코딩테스트에서 만났을 때 항상 애를 먹던 부분이 배열을 돌리는 부분인데, 이렇게 정리하고 헷갈리지 않는 방법을 알게되어 앞으로는 빠르고 정확하게 풀 수 있을 것 같습니다.

profile
세상을 변화시킬 신스틸러 서비스를 만들고싶은 개발자 Gooder 입니다.

0개의 댓글