> 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/undefined-9.md).

# 미세먼지 안녕!

내 멘탈 안녕?!

구현해야하는 부분

1. 미세먼지 확산🔺✅\
   임시 2차원 배열에 미세먼지가 확산되서 인접칸에 이동하는 양✅\
   해당칸에서 빠져나간 양 감산⭐️\
   \=>원래 배열에서 임시 2차원 배열 변수를 더하면 전체 확산된양이 가감된다⭐️
2. **(핵심)**&#xBBF8;세먼지 이동 : **①➜②➜③➜④ 순으로 이동**한다면 **코드로 구현할 때는 마지막에 변하는 것부터 처리**해줘야한다! ⭐️⭐️⭐️⭐️⭐️그렇지 않으면 원래 값이 아니라 갱신되고 난 후의 값이 들어가기 때문에 문제에서 틀린 답이 도출되기 때문이다!

일단 공기청정기가 행 r1,r2를 차지하고 있다고 할 때,\
미세먼지 이동 : 0\~r1 = 반시계방향, r2\~R-1 = 시계방향&#x20;

반시계방향이나 시계방향이나 방향만 다르지 같은 흐름이기 때문에 윗부분의 반시계방향 먼저 본다.

![](https://3269900549-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIbwNq54Ge4eqsziHM7%2F-MgKx-F68t2K6gkfTrCk%2F-MgKz4A_SDM54YutVoVI%2Fimage.png?alt=media\&token=9bef5b88-7dd2-41a4-a7b1-42d3a3c58d92)

큰 흐름에서 미세먼지가 이동하는 순서는 ① =>②=>③=>④ 로 이동한다.\
하지만 이것을 코드로 구현할 때는 다음과 같은 순서로 값이 들어간다.\
④ = ③,\
③ = ②,\
② = ①

그런데 ①에서부터 ②, ③, ④로 이동을 시켜버리면 기존의 n-1번째 미세먼지가 이동되는 게 아니라 새로 갱신된 값들이 이동해버린다!\
② = ①\
③ = ② 이렇게 될 때 ③에 들어가는 ②는 기존의 ②가 아니라 ①로 바뀌어버린 갱신된 값들이다!

따라서 이동하는 순서가 ① =>②=>③=>④ 라고 하면 역순으로 값을 이동시켜준다!(미세먼지 이동)

각각의 작은 흐름 ①, ②, ③, ④를 살펴보면 배열 값이 이동 할때 반복문을 사용해서 이동시키는데\
특히 ①, ④를 살펴보자.\
①에서 변수는 열의 인덱스인 j이다. //변수 j는 증가한다.\
**Arr\[i]\[j] = Arr\[i]\[j-1]**\
j-1번째 값이 j번째에 들어간다. 이때 이것을 증가하는 반복문으로 만들어서 앞에서부터 진행해버리면 위에서 다룬 문제와 같은 문제(기존의 값이 아닌 바뀌고난 후의 값 문제)에 봉착하기 때문에 뒤에서부터 바꿔줘야한다. 따라서 감소반복문으로 구현해야한다.\
④에서도 마찬가지로, 여기서 변수는 행의 인덱스인 i이다. //변수 i는 증가한다.\
Arr\[i]\[j] = Arr\[i-1]\[j]\
i-1번째 값이 i번째에 들어가는데 0에서부터 증가하는 반복문으로 해버리면 갱신되고 난후의 값이 들어가버리기 때문에 ①과 마찬가지로 뒤에서부터 값을 넣어주는 감소반복문으로 구현해야 한다.

감소반복문의 특징 ①,④\
i 번째 = i-1번째

다음 코드처럼 구현해볼 수 있다.\
Arr\[1]\[0] = Arr\[0]\[0]\
Arr\[2]\[0] = Arr\[1]\[0]\
...\
하지만 Arr\[2]\[0]에 Arr\[1]\[0]을 넣을 때 기존의 Arr\[1]\[0]이 아닌, Arr\[0]\[0]으로 바뀌고난 후의 Arr\[1]\[0]이 들어가는 것을 알 수 있다!!!\
그렇기 때문에 앞에서부터 값을 채우는 것이 아니라, 뒤에서부터 값을 채워야한다!!!\
\=>감소하는 반복문으로 구현 가능하다!

```java
for(int i=1;i<=3;i++){
    Arr[i][0] = Arr[i-1][0];
}
```

틀린 부분

1. 공기청정기의 첫 시작 행의 값을 기억하려고 했다.\
   if(Arr\[i]\[j] == -1) {r1 = i; r2 = i+1;}\
   하지만 이렇게 하면 반복문이 진행됨에 따라 사실은 r2의 값인데 r1에 r2의 x좌표가 들어가게 되고, r2에는 원래 r2+1 값이 들어가게 된다!\
   따라서 다음과 같이 바꿀 수 있다. 하지만 반복문의 흐름상 (i,j)를 입력받는 상황에서 미래의 (i+1,j)를 미리 알 수 없기 때문에\
   \=>Arr\[i-1]\[j] == -1 && Arr\[i]\[j] == -1로 바꿀 수 있다.\
   \=>하지만 여기서도 주의해야하는 것이, (i,j)는 (0,0)ㅇ에서 시작하는데 조건문 순서를\
   Arr\[i-1]\[j] == -1 이 먼저 나와버리면 배열 범위 초과 에러가 난다!!!\
   \=>Arr\[i]\[j] == -1 && Arr\[i-1]\[j] == -1 로 최종적으로 조건문 만들어주면 된다!

```java
for(int i=0;i<R;i++){
    for(int j=0;j<C;j++){
        Arr[i][j] = sc.nextInt();
        if(Arr[i][j] == -1 && Arr[i+1][j] == -1) {
            r1 = i; r2 = i+1;
        }
    }
}
```

대망의 미세먼지 이동하는 부분⭐️⭐️⭐️⭐️⭐️\
2중 for문으로 미세먼지 확산과 함께 구현했다.\
이동방향이 같은 r1, r2행을 먼저 함께 구현하고, (C-1)열, 0번째 행& (R-1)행, 0번째 열 구현했다.\
문제점 : 순서가 틀렸다. 위에서 다룬 문제(갱신되고난 후의 값을 이동시켜버림)를 해결해야하기 때문에\
일단 윗부분과 아랫부분으로 나누고, 각 부분마다 위의 올바른 순서대로 구현해야한다.\
\+ 미세먼지 확산, 미세먼지 이동(공기청정기 작동) 스코프 분리해서 해준다.\
미세먼지가 모두 확산한 **이후에** 미세먼지 이동이 일어나야하기 때문에 굳이 같은 스코프에 있지 않아도(?) 된다!

```java
//2.공기청정기 작동!<=tmp의 미세먼지로!
					//2-1.오른쪽으로 이동.
					if(i == r1 || i== r2) {
						if(j-1>=0) {
							tmp[i][j] = tmp[i][j-1];
						}
					}
					//2-2.C-1열.
					if(j == C-1) {
						//2-2-1.위로 이동.
						if(0<=i && i<r1 && i+1<R ) {
							tmp[i][j] = tmp[i+1][j];
						}
						//2-2-2.아래로 이동.
						if(r2<i && i<=(R-1) && 0<=(i-1)) {
							tmp[i][j] = tmp[i-1][j];
						}
					}
					//2-3.왼쪽으로 이동.
					if(i==0 || i == R-1) {
						if(j+1<C) {
							tmp[i][j] = tmp[i][j+1];
						}
					}
					//2-4.0번째 열.
					//2-4-1.아래로 이동.
					if(0<=i && i<r1 && 0<=i-1) {
						tmp[i][j] = tmp[i-1][j];
					}
					//2-4-2.위로 이동.
					if(r2<i && i<=(R-1) && i+1<R) {
						tmp[i][j] = tmp[i+1][j];
					}
					//공기청정기 나온후의 좌표는 0으로 셋팅.
					tmp[r1][1] = 0; tmp[r2][1] = 0;
					
```

![](https://3269900549-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MIbwNq54Ge4eqsziHM7%2F-MgL4JmWBmVxD6wfdAaE%2F-MgL4Op0dcU1hJr7DZso%2Fimage.png?alt=media\&token=54d10b7e-d21c-4cb4-8586-c29c3a55c2fe)

구현 순서 : ④➜③➜②➜①\
큰 흐름, 작은 흐름 모두 마지막의 것을 먼저 갱신시켜준다고 생각하면 편하다!

1. ④ : i값이 변하고 j값은 0으로 고정. Arr\[i]\[0] = Arr\[i-1]\[0]이기 때문 감소반복문으로 구현한다!\
   변수 i의 범위 : 0 \~ CleanRow-1(CleanRow는 공기청정기이기 때문에 그 전까지 이동하면 됨!)

```java
for(int i = CleanRow-1; i>=1;i--){
    Arr[i][0] = Arr[i-1][0];
}
```

2\. ③ : j값이 변하고 i값은 0으로 고정. Arr\[0]\[j] = Arr\[0]\[j+1]. 제일 마지막에 변하는 것이 0번째니까 앞에서부터 시작하 증가 반복문으로 구현한다!\
변수 j의 범위 : 0 \~ C-1

```java
for(int j=0;j<=C-2;j++){
    Arr[0][j] = Arr[0][j+1];
}
```

3\. ② : i값이 변하고, j값은 C-1로 고정. Arr\[i]\[C-1] = Arr\[i+1]\[C-1]. 제일 마지막에 변하는 것이 0번째니까 앞에서부터 시작하는 증가반복문으로 구현!\
변수 i의 범위 : 0 \~ CleanRow

```java
for(int i=0;i<=CleanRow-1;i++){
    Arr[i][C-1] = Arr[i+1][C-1];
}
```

4\. ① : j값이 변하고, i값은 CleanRow로 고정. Arr\[i]\[j] = Arr\[i]\[j-1]. 제일 마지막에 변하는 것이 C-1이니까 끝에서부터 시작하는 감소 반복문으로 구현!\
변수 j의 범위 : 1 \~ C-1 => 1부터 시작하면 공기청정기에서 나온 바로 직후값이기에 0이다. 그래서 2부터 이동시켜주면 된다!

```java
for(int j=C-1;j>=2;j--){
    Arr[CleanRow][j] = Arr[CleanRow][j-1];
}
```

그래도 잘한 부분

1. 공기청정기 행 값 저장 r1, r2
2. \[r1]\[1] = 0, \[r2]\[1] = 0 으로 공기청정기 나온 직후 칸 미세먼지 양 0으로 업데이트.
