미세먼지 안녕!
내 멘탈 안녕?!
Last updated
내 멘탈 안녕?!
Last updated
구현해야하는 부분
미세먼지 확산🔺✅ 임시 2차원 배열에 미세먼지가 확산되서 인접칸에 이동하는 양✅ 해당칸에서 빠져나간 양 감산⭐️ =>원래 배열에서 임시 2차원 배열 변수를 더하면 전체 확산된양이 가감된다⭐️
(핵심)미세먼지 이동 : ①➜②➜③➜④ 순으로 이동한다면 코드로 구현할 때는 마지막에 변하는 것부터 처리해줘야한다! ⭐️⭐️⭐️⭐️⭐️그렇지 않으면 원래 값이 아니라 갱신되고 난 후의 값이 들어가기 때문에 문제에서 틀린 답이 도출되기 때문이다!
일단 공기청정기가 행 r1,r2를 차지하고 있다고 할 때, 미세먼지 이동 : 0~r1 = 반시계방향, r2~R-1 = 시계방향
반시계방향이나 시계방향이나 방향만 다르지 같은 흐름이기 때문에 윗부분의 반시계방향 먼저 본다.
큰 흐름에서 미세먼지가 이동하는 순서는 ① =>②=>③=>④ 로 이동한다. 하지만 이것을 코드로 구현할 때는 다음과 같은 순서로 값이 들어간다. ④ = ③, ③ = ②, ② = ①
그런데 ①에서부터 ②, ③, ④로 이동을 시켜버리면 기존의 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]이 들어가는 것을 알 수 있다!!! 그렇기 때문에 앞에서부터 값을 채우는 것이 아니라, 뒤에서부터 값을 채워야한다!!! =>감소하는 반복문으로 구현 가능하다!
틀린 부분
공기청정기의 첫 시작 행의 값을 기억하려고 했다. 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 로 최종적으로 조건문 만들어주면 된다!
대망의 미세먼지 이동하는 부분⭐️⭐️⭐️⭐️⭐️ 2중 for문으로 미세먼지 확산과 함께 구현했다. 이동방향이 같은 r1, r2행을 먼저 함께 구현하고, (C-1)열, 0번째 행& (R-1)행, 0번째 열 구현했다. 문제점 : 순서가 틀렸다. 위에서 다룬 문제(갱신되고난 후의 값을 이동시켜버림)를 해결해야하기 때문에 일단 윗부분과 아랫부분으로 나누고, 각 부분마다 위의 올바른 순서대로 구현해야한다. + 미세먼지 확산, 미세먼지 이동(공기청정기 작동) 스코프 분리해서 해준다. 미세먼지가 모두 확산한 이후에 미세먼지 이동이 일어나야하기 때문에 굳이 같은 스코프에 있지 않아도(?) 된다!
구현 순서 : ④➜③➜②➜① 큰 흐름, 작은 흐름 모두 마지막의 것을 먼저 갱신시켜준다고 생각하면 편하다!
④ : i값이 변하고 j값은 0으로 고정. Arr[i][0] = Arr[i-1][0]이기 때문 감소반복문으로 구현한다! 변수 i의 범위 : 0 ~ CleanRow-1(CleanRow는 공기청정기이기 때문에 그 전까지 이동하면 됨!)
2. ③ : j값이 변하고 i값은 0으로 고정. Arr[0][j] = Arr[0][j+1]. 제일 마지막에 변하는 것이 0번째니까 앞에서부터 시작하 증가 반복문으로 구현한다! 변수 j의 범위 : 0 ~ C-1
3. ② : i값이 변하고, j값은 C-1로 고정. Arr[i][C-1] = Arr[i+1][C-1]. 제일 마지막에 변하는 것이 0번째니까 앞에서부터 시작하는 증가반복문으로 구현! 변수 i의 범위 : 0 ~ CleanRow
4. ① : j값이 변하고, i값은 CleanRow로 고정. Arr[i][j] = Arr[i][j-1]. 제일 마지막에 변하는 것이 C-1이니까 끝에서부터 시작하는 감소 반복문으로 구현! 변수 j의 범위 : 1 ~ C-1 => 1부터 시작하면 공기청정기에서 나온 바로 직후값이기에 0이다. 그래서 2부터 이동시켜주면 된다!
그래도 잘한 부분
공기청정기 행 값 저장 r1, r2
[r1][1] = 0, [r2][1] = 0 으로 공기청정기 나온 직후 칸 미세먼지 양 0으로 업데이트.