반응형

백준 1895번 문제입니다. (solved.ac) 기준 실버 4 문제입니다.

https://www.acmicpc.net/problem/1895

 

1895번: 필터

숫자 9개가 오름차순이나 내림차순으로 정렬되어 있을 때, 중앙값은 다섯 번째 숫자이다. 예를 들어, 1, 3, 4, 1, 2, 6, 8, 4, 10의 중앙값은 4이다. (1 ≤ 1 ≤ 2 ≤ 3 ≤ 4 ≤ 4 ≤ 6 ≤ 8 ≤ 10) 이미지 I는

www.acmicpc.net

문제

문제 접근

이미지(2차원 배열)를 입력받고 3 * 3필터를 통해 이미지의 중앙값을 찾으면서 필터링한 후 해당 이미지에 T 보다 크거나 같은 픽셀의 수를 구하는 문제입니다. 3 * 3 필터를 사용하면 9개의 숫자를 확인할 수 있는데 9개의 수들 중 5번째 숫자가 중앙값입니다.

이미지를 3 * 3으로 완전탐색한 후 중앙값들을 찾아서(필터링) T보다 크거나 같은 수들을 구하는 방식으로 문제를 해결하였습니다.

정답 코드

/**
 * 제한사항
 * - 숫자 9개가 정렬되어있을 경우 5번째 숫자가 중앙값
 * - 이미지 I는 크기가 R * C인 2차원 픽셀
 *      - R과 C는 3이상 40이하
 * - 각 픽셀은 어두운 정도 V를 나타냄
 *      - V는 0이상 255이하
 * - 필터의 크기는 3 * 3
 *
 * 아이디어
 * - 3 * 3 크기로 이미지를 완전탐색
 * - 중앙값들을 모은 후 T보다 크거나 같은 픽셀의 수를 구하자
 *
 * 이슈
 * - NumberFormat 에러가 발생...왜지?
 *      - C개의 픽셀 값이 주어질 때 공백이 딸려오나봄..^^ 코틀린 왜이래
 */

data class Pos(val x: Int, val y: Int)

fun main() {

    val filterDir = listOf(
        Pos(0, 0),
        Pos(0, 1),
        Pos(0, 2),
        Pos(1, 0),
        Pos(2, 0),
        Pos(1, 1),
        Pos(1, 2),
        Pos(2, 1),
        Pos(2, 2),
    )

    var ans = 0
    val (r, c) = readln().split(" ").map { it.toInt() }
    val imgDataList = mutableListOf<List<Int>>()

    repeat(r) {
        val colList = readln().trim().split(" ").map { it.toInt() }
        imgDataList.add(colList)
    }

    val t = readln().toInt()

    for (row in 0..r - 3) {
        for (col in 0..c - 3) {
            val filteredList = mutableListOf<Int>()
            filterDir.forEach { pos ->
                filteredList.add(imgDataList[row + pos.x][col + pos.y])
            }
            if (t <= filteredList.sorted()[4]) ans++
        }
    }

    println(ans)
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기