# 미세먼지 안녕!

구현해야하는 부분

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

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

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

![](/files/-MgKz4A_SDM54YutVoVI)

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

그런데 ①에서부터 ②, ③, ④로 이동을 시켜버리면 기존의 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;
					
```

![](/files/-MgL4Op0dcU1hJr7DZso)

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

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으로 업데이트.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://heunnajo.gitbook.io/algorithms-problem-solving-skills/undefined-1/undefined-9.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
