티스토리 뷰

반응형

문제

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

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

입력

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

출력

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

예제

예제 입력 1 예제 출력1
4 4
....
....
....
....
4

 

풀이

  1. 성의 가로 길이와 세로 길이를 초기화하고 가로기준과 세로기준으로 경비원의 유무를 나타내는 boolean 배열을 정의한다.
  2. 모든 칸을 확인하며 경비원이 있는 경우 그 위치(l,m)에 해당하는 배열의 값(guardL(l), guardW(w))을 true로 변경해 경비원이 있음을 표시하고 가로 길이 혹은 세로 길이를 1 감소시킨다.
  3. 모든 칸을 확인한 후 가로 길이와 세로 길이 중 큰 값이 정답이다. (최소한 추가해야하는 경비원의 수)
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*

fun main() {

    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = System.out.bufferedWriter()

    val st = StringTokenizer(br.readLine())
    val n = st.nextToken().toInt()
    val m = st.nextToken().toInt()

    val guardL = BooleanArray(n)
    val guardW = BooleanArray(m)
    var length = n
    var width = m

    repeat(n) { l ->
        val chars = br.readLine().toCharArray()
        repeat(m) { w ->
            // 경비원이 있는 칸
            // 세로칸 체크
            if (chars[w] == 'X' && !guardL[l]) {
                guardL[l] = true
                length--
            }
            // 가로칸 체크
            if (chars[w] == 'X' && !guardW[w]) {
                guardW[w] = true
                width--
            }
        }
    }

    val answer = if (length > width) length else width
    bw.write("${answer}\n")
    bw.flush()
    bw.close()
    br.close()
}
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함