https://school.programmers.co.kr/learn/courses/30/lessons/92344
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- 적의 공격 혹은 아군의 회복 스킬이 모두 끝난 뒤 파괴되지 않은 건물의 개수를 return - 주어진 자료는 무엇인가?
- 건물의 내구도를 나타내는 2차원 정수 배열 board
- 적의 공격 혹은 아군의 회복 스킬을 나타내는 2차원 정수 배열 skill
- 건물은 적의 공격을 받으면 내구도가 감소하고 내구도가 0이하가 되면 파괴 - 조건은 무엇인가?
- skill의 각 행은 [type, r1, c1, r2, c2, degree]형태를 가지고 있습니다.
- type은 1 혹은 2입니다.- type이 1일 경우는 적의 공격을 의미합니다. 건물의 내구도를 낮춥니다.
- type이 2일 경우는 아군의 회복 스킬을 의미합니다. 건물의 내구도를 높입니다.
2. 계획
- skills 요소 하나씩 순회한다
- type이 1이라면 주어진 행렬 범위 숫자를 degree 만큼 뺀다.
- type이 2라면 주어진 행렬 범위 숫자를 degree 만큼 더한다.
- board의 요소가 0 넘는것만 세어준다.
- 이를 리턴한다.
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const attack = (board, skill) => {
const [type, r1, c1, r2, c2, degree] = skill;
for (i = r1; i <= r2; i++) {
for (j = c1; j <= c2; j++) {
if (type === 1) {
board[i][j] = board[i][j] - degree
}
if (type === 2) {
board[i][j] = board[i][j] + degree
}
}
}
return board
}
const solution = (board, skills) => {
for (let i = 0; i < skills.length; i++) {
attack(board, skills[i])
}
return board.reduce((sum, rows) => {
return sum + rows.filter((col) => col > 0).length;
}, 0);
};
test('countBuildings', () => {
expect(solution([[10]], [[1, 0, 0, 0, 0, 5]])).toEqual(1);
expect(solution([[7, 3]], [[1, 0, 0, 0, 1, 2]])).toEqual(2);
expect(solution([[1, 2], [3, 4]], [[1, 0, 0, 0, 0, 2], [1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 2]])).toEqual(2);
expect(solution([[5, 6, 7]], [[1, 0, 0, 0, 0, 2]])).toEqual(3);
expect(solution([[5, 6, 7], [7, 8, 9]], [[1, 0, 0, 0, 0, 2]])).toEqual(6);
expect(solution([[5, 5, 5, 5, 5], [5, 5, 5, 5, 5], [5, 5, 5, 5, 5], [5, 5, 5, 5, 5]], [[1, 0, 0, 3, 4, 4], [1, 2, 0, 2, 3, 2], [2, 1, 0, 3, 1, 2], [1, 0, 1, 3, 3, 1]])).toEqual(10);
})
4. 반성
- 정확성 테스트는 통과했는데 유효성 테스트를 통과하지 못했다.
- 유효성 테스트도 통과할 수 있도록 해봐야겠다.
'코테연습' 카테고리의 다른 글
163. H-Index Javascript (0) | 2022.09.20 |
---|---|
162. 행렬의 곱셈 Javascript (0) | 2022.09.19 |
160. 주차 요금 계산 Javascript (0) | 2022.09.19 |
159. 캐시 Javascript (0) | 2022.09.19 |
158. 점프와 순간 이동 Javascript (0) | 2022.09.18 |
댓글