구름톤 챌린지
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let N, K;
let ground = [];
let location = [];
let max = 0;
rl.on('line', (line) => {
if (!N) {
[N, K] = line.split(' ').map(Number);
}
else if (ground.length < N) {
let arr = line.split(' ').map((value) => {
return [value, 0];
})
ground.push(arr);
}
else if (location.length < K) {
location.push(line.split(' ').map(Number));
if (location.length >= K)
rl.close();
}
})
function boomer(y, x) {
if ((y < 1 || y > N) || (x < 1 || x > N))
return;
let arr = ground[y - 1][x - 1];
switch (arr[0]) {
case '0':
arr[1]++;
break;
case '@':
arr[1] = arr[1] + 2;
break;
}
return arr[1];
}
function controller(y, x) {
let spot = [];
let max = 0;
let cnt;
spot.push([y - 1, x]);
spot.push([y, x - 1]);
spot.push([y, x]);
spot.push([y + 1, x]);
spot.push([y, x + 1]);
spot.forEach((arr) => {
let [y, x] = arr;
cnt = boomer(y, x);
if (cnt > max)
max = cnt;
});
return max;
}
// N K goorm location
rl.on('close', () => {
let max = 0;
location.forEach((val) => {
let [y, x] = val;
let cnt;
cnt = controller(y, x);
if (cnt > max)
max = cnt;
})
console.log(max);
})
1차 시도, 리팩토링 전
설계
- 인자로 N, K 를 한 번에 받고, N이 undefined 가 아닐 때 맵을 받음
- 맵이 저장된 배열의 길이가 N과 같다면 투하할 위치를 받고 readline 을 close
- 투하 위치를 갖는 배열을 돌며 투하 위치를 넘김
- 영향 받는 위치를 갖는 배열 생성 후 순환하며 폭탄 투하
- 이후 하나의 투하에 대해서 가장 큰 수를 구하고, 각 투하들 중 가장 큰 수도 구하며 답을 출력
생각해볼 거리
- 기존에는 max 변수를 전역으로 관리해서 특정 함수가 하는 일이 증가했기 때문에 가독성이 떨어짐. 현재 boomer 함수는 폭탄 투하 범위에 대해서만 연산하기 때문에 프로그램 확대에 용이해진다..
- 기존에 폭탄 투하 위치를 그대로 계산하여 함수에 직접 넣었는데 이렇게 하면 boomer() 함수 호출이 잦아져서 한 위치 투하에 대해서 가장 큰 수를 계산하기 애매해짐. 왜냐하면 가장 큰 수를 계산하려면 if 문을 써야하는데 boomer() 의 호출만큼 늘어나기 때문이다. 그래서 이들을 배열에 따로 저장하게 되었다.
- ‘0’ 또는 ‘@’ 인 지역만 수가 늘어나므로, 이를 계속 저장하도록 함. 처음 땅의 상태를 map 으로 받고 이를 저장한 뒤, 폭탄 투하에 따른 폭탄 값을 따로 저장하면 배열의 해당 위치를 꼭 기억해야 하고, 두 개의 배열을 반복하며 왕복할 것 같아 하나의 배열 안에 두 값을 한 번에 저장하도록 함. 이렇게 하면 폭탄을 투하하자 마자 값을 계산하며 최대값을 실시간으로 알 수 있다.
- 그래서 아래와 같이 저장함. 왼쪽은 땅의 상태고, 오른쪽은 폭탄 값이다.
[
[ [ '0', 0 ], [ '0', 1 ], [ '@', 0 ], [ '0', 0 ] ],
[ [ '0', 0 ], [ '0', 0 ], [ '0', 0 ], [ '0', 0 ] ],
[ [ '0', 0 ], [ '#', 0 ], [ '0', 0 ], [ '0', 0 ] ],
[ [ '0', 0 ], [ '0', 0 ], [ '0', 0 ], [ '@', 0 ] ]
]
[
[ [ '0', 0 ], [ '0', 1 ], [ '@', 0 ], [ '0', 0 ] ],
[ [ '0', 1 ], [ '0', 0 ], [ '0', 0 ], [ '0', 0 ] ],
[ [ '0', 0 ], [ '#', 0 ], [ '0', 0 ], [ '0', 0 ] ],
[ [ '0', 0 ], [ '0', 0 ], [ '0', 0 ], [ '@', 0 ] ]
]
[
[ [ '0', 0 ], [ '0', 1 ], [ '@', 0 ], [ '0', 0 ] ],
[ [ '0', 1 ], [ '0', 1 ], [ '0', 0 ], [ '0', 0 ] ],
[ [ '0', 0 ], [ '#', 0 ], [ '0', 0 ], [ '0', 0 ] ],
[ [ '0', 0 ], [ '0', 0 ], [ '0', 0 ], [ '@', 0 ] ]
]
[
[ [ '0', 0 ], [ '0', 1 ], [ '@', 0 ], [ '0', 0 ] ],
[ [ '0', 1 ], [ '0', 1 ], [ '0', 0 ], [ '0', 0 ] ],
[ [ '0', 0 ], [ '#', 0 ], [ '0', 0 ], [ '0', 0 ] ],
[ [ '0', 0 ], [ '0', 0 ], [ '0', 0 ], [ '@', 0 ] ]
]