본문 바로가기
코테연습

161. 파괴되지 않은 건물 Javascript

by hxunz 2022. 9. 19.

https://school.programmers.co.kr/learn/courses/30/lessons/92344

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 적의 공격 혹은 아군의 회복 스킬이 모두 끝난 뒤 파괴되지 않은 건물의 개수를 return
  • 주어진 자료는 무엇인가?
     - 건물의 내구도를 나타내는 2차원 정수 배열 board
     - 적의 공격 혹은 아군의 회복 스킬을 나타내는 2차원 정수 배열 skill
     - 건물은 적의 공격을 받으면 내구도가 감소하고 내구도가 0이하가 되면 파괴
  • 조건은 무엇인가?
     - skill의 각 행은 [type, r1, c1, r2, c2, degree]형태를 가지고 있습니다.
     - type은 1 혹은 2입니다.
    • type이 1일 경우는 적의 공격을 의미합니다. 건물의 내구도를 낮춥니다.
    • type이 2일 경우는 아군의 회복 스킬을 의미합니다. 건물의 내구도를 높입니다.

2. 계획

  1. skills 요소 하나씩 순회한다
  2. type이 1이라면 주어진 행렬 범위 숫자를 degree 만큼 뺀다.
  3. type이 2라면 주어진 행렬 범위 숫자를 degree 만큼 더한다. 
  4. board의 요소가 0 넘는것만 세어준다.
  5. 이를 리턴한다. 

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

댓글