728x90
📌 문제
📌 입력
📌 출력
📌 예제 입출력
📌 풀이
알아야 하는 것
- arr.flat (공식 문서)
- flat() 이면 그냥 1차원을 제거한다.
- 배열의 구멍도 제거한다.
구할 것
- 입력값 받기
- 입력값을 이렇게 받아도 될지 모르겠는데...예제 1로 하면 처음에 들어오는 값이 [4 4]로, 이 값을 scale과 count로 받아준다. input의 전체 길이는 처음 들어오는 [4 4]와 한 변의 길이 만큼, 폭탄을 떨어뜨릴 횟수 만큼 들어오니 scale + count + 1로 받았다.
- 데이터 가공
- 입력값의 첫 줄을 scale, count로 잘라내고, 이후 input의 0번째 인덱스부터 scale까지를 잘라내 map으로 만든다.
- 잘라냈기 때문에 남은 input의 값은 좌표만 남아 있다. 따라서 나머지를 position이라고 좌표를 모아둔 배열에 넣을 건데, 좌표의 인덱스와 실제 배열의 인덱스 간에 차이가 1씩 나기 때문에 map을 이용해 아예 좌표에서 1을 모두 빼주었다.
- map과 별개로 앞으로 폭탄 값을 더해줄 2차원 배열이 필요하다. scale이랑 똑같은 크기여야 하기 때문에 그렇게 만들어주되 모두 0으로 초기화 해서 cal이라고 만들어줬다.
- 폭탄 점수 계산
- 먼저 폭탄이 떨어지는 곳 + 폭탄이 떨어진 상하좌우를 모두 계산해야 한다.
- count만큼 position을 돌아줄 건데, 이 때 position은 좌표가 들어와 있다. 따라서 [y, x] 좌표로 받아준다.
- 만약 map에서 y, x좌표가 0이라면 cal의 y, x좌표에 1씩 더해주고, @라면 2씩 더해준다.
- 폭탄이 떨어진 상하좌우를 계산하는 과정은 상하좌우 좌표를 넣은 dt를 이용한다.
- dt를 순회하면서 해당 값을 현재 위치인 y, x좌표에 더해준 것을 ny, nx라고 한다.
- 이 때 ny, nx의 범위는 0보다 크거나 같아야 하면서 scale보다는 작아야 한다.
- 위 조건을 만족할 때 만약 map에서 ny, nx가 0이라면 cal의 ny, nx 좌표에 1씩 더해주고, @라면 2씩 더해준다.
- 더하고 나면 cal은 2차원 배열이 되어 있다. 그러니까 cal의 한 행 한 행이 배열로 들어와 있어서, 이걸 모두 같은 차원의 배열로 받아줘서 거기서 최대값을 찾고 싶다. for문으로 각각 순회하는 방법도 있지만, 차원을 맞추기 위해 flat을 사용해 1차원으로 통일했다.
- 이후 여기서 Math.max를 사용해 최대값을 구했다. 배열을 Math.max로 할 때는 꼭 스프레드 문법으로 전개해 계산하자!
- 먼저 폭탄이 떨어지는 곳 + 폭탄이 떨어진 상하좌우를 모두 계산해야 한다.
const readline = require('readline');
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
let scale, count;
rl.on('line', (line) => {
input.push(line);
[scale, count] = input[0].split(" ").map(Number);
if (input.length === scale + count + 1) {
rl.close();
}
});
rl.on('close', () => {
let [scale, count] = input.shift().split(" ").map(Number);
let map = input.splice(0, scale).map((v) => v.split(" "));
let position = input.map((v) => v.split(" ").map(Number).map((v) => v - 1));
let cal = Array.from(Array(scale), () => Array(scale).fill(0));
const dt = [[0, -1], [0, 1], [-1, 0], [1, 0]];
for (let k = 0; k < count; k++) {
const [y, x] = position[k];
if (map[y][x] === '0') {
cal[y][x] += 1;
} else if (map[y][x] === '@') {
cal[y][x] += 2;
}
for (let i = 0; i < 4; i++) {
const ny = y + dt[i][0];
const nx = x + dt[i][1];
if (ny >= 0 && ny < scale && nx >= 0 && nx < scale) {
if (map[ny][nx] === '0') {
cal[ny][nx] += 1;
} else if (map[ny][nx] === '@') {
cal[ny][nx] += 2;
}
}
}
}
console.log(Math.max(...cal.flat()));
});
구름 문제는 저번에도 느꼈는데 y, x 좌표가 바뀌어 있어서 혼란을 야기한다.
그리고 블로그에 쓰기 좋게 문제 부분을 복붙 할 수 있게 해줬으면 좋겠다...
매번 이미지 캡쳐하기 귀찮음...
728x90
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 구름톤 챌린지 3주차 코딩테스트 : 통증(2) (0) | 2023.08.31 |
---|---|
[JavaScript] 구름톤 챌린지 2주차 코딩테스트 : GameJam (못 품) (0) | 2023.08.31 |
[JavaScript] 구름톤 챌린지 2주차 코딩테스트 : 통증 (0) | 2023.08.23 |
[JavaScript] 구름톤 챌린지 2주차 코딩테스트 : 구름 찾기 깃발 (0) | 2023.08.22 |
[JavaScript] 구름톤 챌린지 2주차 코딩테스트 : 문자열 나누기 (0) | 2023.08.22 |