새소식

Study/Algorithm

[백준] 1236번 성 지키기 - Node.js/JavaScript

  • -

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
2 초 128 MB 11195 4312 3631 40.520%

문제

영식이는 직사각형 모양의 성을 가지고 있다. 성의 1층은 몇 명의 경비원에 의해서 보호되고 있다. 영식이는 모든 행과 모든 열에 한 명 이상의 경비원이 있으면 좋겠다고 생각했다.

성의 크기와 경비원이 어디있는지 주어졌을 때, 몇 명의 경비원을 최소로 추가해야 영식이를 만족시키는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 성의 세로 크기 N과 가로 크기 M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 성의 상태가 주어진다. 성의 상태는 .은 빈칸, X는 경비원이 있는 칸이다.

출력

첫째 줄에 추가해야 하는 경비원의 최솟값을 출력한다.

예제 입력 1 

4 4
....
....
....
....

예제 출력 1 

4

예제 입력 2 

3 5
XX...
.XX..
...XX

예제 출력 2 

0

예제 입력 3 

5 8
....XXXX
........
XX.X.XX.
........
........

예제 출력 3 

3

나의 풀이

const [nm, ...arr] = require('fs').readFileSync('./input.txt').toString().trim().split('\n')

// n 세로 m 가로
const [n, m] = nm.split(' ').map(Number)

function solution(n, m, arr) {
  let row = 0, col = 0, cnt = 0;

  // row check
  for (let i = 0; i < n; i++) {
    if (!arr[i].includes('X')) {
      row++
    }
  }

  // column check
  for (let j = 0; j < m; j++) {
    cnt = 0
    for (let k = 0; k < n; k++) {
      if (arr[k][j] === 'X') {
        cnt++
      }
      if (k === n - 1 && cnt === 0) {
        col++
      }
    }
  }

  // 둘 중 큰 수 리턴
  return Math.max(row, col)
}

console.log(solution(n, m, arr))

간단하게 row에 x가 있으면 row에 체크

column에 x가 있으면 column에 체크해서 

둘 중에 더 큰 수를 리턴하면 된다고 생각했다!

 

구현하기 위해서 row는 그냥 includes로 찾았고

세로줄을 찾으려면 j는 m크기 만큼 k는 n만큼 해서

arr[k][j] 에서 k만 계속 ++되게!

 

한 열에서 하나만 있으면 되니까

x가 있으면 cnt를 ++ 해주고 

for문이 한 열을 다 돌고, cnt가 0이면 col에 체크해줬다. 

 

해서 

최종으로 row와 col 중에 더 큰 수를 리턴한다.

 

Contents

포스팅 주소를 복사했습니다.

이 글이 도움이 되었다면 공감 부탁드립니다.