회고
[개발일지] - 259(연차)
Happy Programmer
2024. 3. 15. 23:28
(1).백준 17144번 미세먼지 안녕!은 미세먼지가 퍼지고 있는 공간에서 공기청정기를 투입했을 때
일정 시간이 지난 이후 먼지가 얼마나 남았는지를 계산해야 하는 문제였다.
일단 먼지의 확산을 계산해야 했는데 계산을 진행할 새로운 배열을 생성한 다음
해당 배열에 확산 처리 후의 값을 할당하는 방식으로 진행했다.
수도코드로 생각하면 아래와 같다.
1.확산처리
1-1.현재 값을 새로운 배열의 현재 위치에 넣어주기
1-2.현재 값을 5로 나눈 몫을 4방향을 체크해 넣어주며 값을 넣을 때 중앙 값에 몫만큼 감소
2.처리된 배열 input에 할당
3.input 내부 값을 공기청정기 작동 기준으로 위, 아래 공기순환 처리하기
4.n회만큼 반복된 배열 내부의 총 합을 출력('-1' 2개로 인해 +2 처리 후 출력)
중간 중간 결과를 확인할 때 문제가 있는 부분은 index 처리에서 헷갈려서 나온 값이었고
한번 완성한 값을 테스트케이스들을 넣고 테스트해보니 정상 출력되어 제출 후 통과했다.
let input = `7 8 50
0 0 0 0 0 0 0 9
0 0 0 0 3 0 0 8
-1 0 5 0 0 0 22 0
-1 8 0 0 0 0 0 0
0 0 0 0 0 10 43 0
0 0 5 0 15 0 0 0
0 0 40 0 0 0 20 0`.split('\n').map(el => el.split(' ').map(Number))
const [x, y, time] = input.shift()
let airCleanerIndex
let newArr = []
let count = 0
for(let i = 0 ; i < input.length ; i++){
if(input[i].includes(-1)){
airCleanerIndex = i
break
}
}
const arrReset = () => {
newArr = []
for(let i = 0 ; i < x ; i++){
newArr.push(new Array(y).fill(0))
}
newArr[airCleanerIndex][0] = -1
newArr[airCleanerIndex + 1][0] = -1
}
const spread = (i,j,num) => {
const spreadNum = Math.floor(num/5)
let spreadCount = 0
if(newArr[i][j+1] != null && newArr[i][j+1] != -1){
newArr[i][j+1] += spreadNum
spreadCount++
}
if(newArr[i][j-1] != null && newArr[i][j-1] != -1){
newArr[i][j-1] += spreadNum
spreadCount++
}
if(newArr[i+1] != null && newArr[i+1][j] != null && newArr[i+1][j] != -1){
newArr[i+1][j] += spreadNum
spreadCount++
}
if(newArr[i-1] != null && newArr[i-1][j] != null && newArr[i-1][j] != -1){
newArr[i-1][j] += spreadNum
spreadCount++
}
newArr[i][j] += num - spreadCount * spreadNum
}
const spreadAll = () => {
arrReset()
for(let i = 0 ; i < x ; i++){
for(let j = 0 ; j < y ; j++){
if(input[i][j] > 0 ){
spread(i,j,input[i][j])
}
}
}
input = newArr
}
const workAirConditioner = () => {
//윗부분 좌측
for(let i = airCleanerIndex - 1 ; i > 0 ; i--){
input[i][0] = input[i-1][0]
}
//윗부분 상단
for(let i = 0 ; i < y-1 ; i++){
input[0][i] = input[0][i+1]
}
//윗부분 우측
for(let i = 0 ; i < airCleanerIndex ; i++){
input[i][y-1] = input[i+1][y-1]
}
//윗부분 하단
for(let i = y-1 ; i > 1 ; i--){
input[airCleanerIndex][i] = input[airCleanerIndex][i-1]
}
//0 추가
input[airCleanerIndex][1] = 0
///아랫부분 수정필요
//아랫부분 좌측
for(let i = airCleanerIndex + 2 ; i < x-1 ; i++){
input[i][0] = input[i+1][0]
}
//아랫부분 하단
for(let i = 0 ; i < y-1 ; i++){
input[x-1][i] = input[x-1][i+1]
}
//아랫부분 우측
for(let i = x-1 ; i > airCleanerIndex+1 ; i--){
input[i][y-1] = input[i-1][y-1]
}
//아랫부분 상단
for(let i = y-1 ; i > 1 ; i--){
input[airCleanerIndex+1][i] = input[airCleanerIndex+1][i-1]
}
//0 추가
input[airCleanerIndex+1][1] = 0
}
while (count < time) {
spreadAll()
workAirConditioner()
count++
}
let sum = 0
for(let i = 0 ; i < x ; i++){
for(let j = 0 ; j < y ; j++){
sum += input[i][j]
}
}
console.log(sum + 2)