> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/algorithms-problem-solving-skills/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/algorithms-problem-solving-skills/undefined-1/untitled.md).

# 톱니바퀴

회전 판단하는 함수, 회전시키는 함수 따로 구현함.

틀린 이유

1. **재귀함수호출** 안함 : rotate\_check 함수에서 재귀호출을 통해 **왼쪽의 왼쪽 톱니바퀴, 오른쪽의 오른쪽 톱니바퀴에 대해 처리**해줘야하는데 **재귀함수 호출을 하지 않고** 회전시키는 함수를 호출해버리니 **현재의 왼쪽, 오른쪽 톱니바퀴만 해당**되기 때문에 틀린다!!!
2. (구현은 했지만 좀 더 발전시키기)flag변수를 만들어서 왼쪽의 경우 왼쪽 방향에 있는 톱니바퀴들만 회전, 오른쪽의 경우 오른쪽 방향에 있는 톱니바퀴들만 회전하도록 한다.\
   **=>초기의 경우는 일단 무조건 실행**되야하므로 **초기** **flag=0으로 해서 flag가 0인 경우는 둘다 실행**되도록 한다.
3. **왼쪽 방향에 있는 톱니바퀴들만 회전, 오른쪽의 경우 오른쪽 방향에 있는 톱니바퀴들만 회전** 구현 안함.\
   위의 flag값을 이용해서 왼쪽인 경우, 오른쪽인 경우 따로 재귀호출 처리해준다!
4. (구현은 했지만 좀 더 발전시키기)범위 체크 => 범위체크 잘 하긴 했는데 범위체크는 **재귀함수 호출할 때 처리**해주면 된다.\
   재귀함수 호출 전에 prev\[2] cur\[6] 조건 체크할 때 범위 체크도 함께 해주면(if문을 하나로 합친다!)\
   코드가 간결해진다!\
   재귀함수 호출할 때 범위체크를 하기 때문에 재귀함수 시작하자마자 범위체크는 없애도 된다.&#x20;
5. 반시계방향 회전시키는 증감문 틀&#xB9BC;**(또 틀린 부분) => 우변 먼저 생각해라!!**\
   **우변이 실제로 들어가는 값이다!!!!!!**

**반시계방향 틀린 이유**\
**아래코드는 손코딩 디버깅해보면 이것은 시계방향이다!! 좌변을 기준으로 생각해버려서 틀렸다!!**\
**코드는 우변의 값이 좌변에 대입되는 개념인데 아래 코드는 글을 읽듯이 왼쪽부터 해석해버려서 틀렸다!!**\
**g\[7] = g\[6]**\
**g\[6] = g\[5]**\
**g\[5] = g\[4]**\
**...**\
**g\[1] = g\[0]**

```java
//2.반시계방향 회전.
		if(dir == -1) {
			int tmp = gears[index][0];
			for(int i=7;i>0;i--) {//a[n] = a[n+1]
				gears[index][i] = gears[index][i-1];
			}
			gears[index][7] = tmp;
		}
```

![](https://3269900549-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIbwNq54Ge4eqsziHM7%2F-MfaHvh06Hmm6NQ6o5NO%2F-MfaJKvCBny1RNqF6ryr%2Fimage.png?alt=media\&token=e595151b-0069-4a9d-922a-9bf49a5f3427)

1. rotate\_check 함수 : 회전 여부 확인하고 톱니회전함수 rotate 호출, 실행.

```java
static void rotate_check(int index,int dir,int flag) {
		if(index <0 || index>3) return;
		//초기에 flag = 0. 일단 무조건 실행.
		if(flag == -1 || flag == 0) {
			if(index-1 <0) return;
			if(gears[index-1][2] != gears[index][6]) {
				rotate(index-1,-dir);//왼쪽 톱니바퀴에서 왔다.왼쪽만 생각한다.
			}
		}
		if(flag == 1 || flag == 0) {
			if(index+1 >3) return;
			if(gears[index][2] != gears[index+1][6]) {
				rotate(index+1,-dir);
			}
		}
		//톱니 회전.
		rotate(index,-dir);
	}
```

2\. rotate 함수 : 톱니바퀴들 회전.\
틀린 이유=>시계, 반시계 방향에서 회전시킬 때 증감문부분 서로 반대됨!

```java
	static void rotate(int index,int dir) {
		//1.시계방향 회전.
		if(dir == 1) {
			int tmp = gears[index][7];
			for(int i=1;i<7;i++) {
				gears[index][i] = gears[index][i-1];
			}
			gears[index][0] = tmp;
		}
		//2.반시계방향 회전.
		if(dir == -1) {
			int tmp = gears[index][0];
			for(int i=7;i>0;i--) {//a[n] = a[n+1]
				gears[index][i] = gears[index][i-1];
			}
			gears[index][7] = tmp;
		}

	}
```

디버깅용 톱니바퀴 출력

```java
//		System.out.println("===== 톱니바퀴 정보 출력 =====");
//		for(int i=0;i<4;i++) {
//			for(int j=0;j<8;j++) {
//				System.out.print(gears[i][j]+" ");
//			}
//			System.out.println();
//		}
```
