자료구조, 알고리즘

2차원 배열 원소 한칸씩 옮기기

제로펩시콜라 2022. 2. 27. 11:59
728x90

달팽이 배열에 이어 2차원 배열에서 원소들을 한칸씩 이동하는 경우도 있을 수 있다.

이 경우도 달팽이 배열을 찍는것과 크게 다르지 않다. 

 

다음과 같이 원소를 한 칸씩 시계방향으로 이동시켜야 한다고 해보자. 

 

두 변수의 값을 switching할때처럼 그냥 바꿀 수는 없고 값을 임시저장할 변수를 이용하는데 

이 경우도 그 아이디어는 같다. 어느 위치의 값을 임시저장 해줄것인지는 자유이지만 여기서는 (0,0)이라고 하겠다. 

 

여기서 (0,0)좌표의 값을 임시저장 했으므로 바로 밑에있는 (1,0)의 값을 (0,0)으로 가져와야한다. 

즉, 시계방향으로 한칸씩 이동시킬 때, 현재 위치에 놓일 다음 값은 반시계 방향으로 찾으러 가야한다.  

따라서 next값의 방향이 이동방향과 반대가 되는것이다.

 

원소 한칸씩 옮기기는 이 점들만 유의하면 크게 어렵지 않다. 

 

이를 구현한 코드를 보면 다음과 같다.

static void rightturn() {							// 시계방향으로 한칸씩 원소 옮기기 
		
		int nowi = 0; int nowj = 0;					
		int tmp = arr[0][0];						// 임시저장할 원소 1개
		int d = 0;									// 방향배열의 index
		
		while(true) {	
			int ni = nowi+rdi[d];					// next 좌표 
			int nj = nowj+rdj[d];		
			
			if(ni==0 && nj==0) {					// 한바퀴 돌았을때
				arr[nowi][nowj] = tmp;				// 임시저장한 원소를 now에 입력후 빠져나온다
				break;
			}
			
			if(check(ni, nj) && visit[ni][nj]==0) {	// 달팽이 모양으로 이동 
				arr[nowi][nowj] = arr[ni][nj];		// 원소 이동 
				nowi = ni; nowj = nj;
				visit[ni][nj] = 1;
			}else {
				d = (d+1)%4;						// 방향 바꾸기 
			}
		}
	}