거리두기 확인하기

링크: 거리두기 확인하기

 

코딩테스트 연습 - 거리두기 확인하기

[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]

programmers.co.kr

 

하나의 반에 대해서 다음을 수행한다.

  1. 전체 순회를 돌며 각 사람에 대해서 bfs를 수행한다.
  2. bfs를 수행하며, 빈 테이블일 경우 지나온 거리를 카운트 해서 저장한다.
  3. bfs를 수행하다 사람을 만나게 될 경우 이전 빈테이블, 사람의 거리가 2 이하일 경우
    • 그 반은 적합하지 않다고 마킹한다.

위를 모든 반에 대해서 수행을 하고 마킹된 값을 읽어 answer 값에 담아 리턴한다.

 

  • 정답 코드
import java.util.*

class Solution {
    val arrSize = 5
    val classDistance = Array(arrSize) { Array(arrSize) { Array(arrSize){0} } }
    val visited = Array(arrSize) { Array(arrSize) { Array(arrSize){false} } }
    val isOk = Array(arrSize) { true }

    val dx = arrayOf(1, -1, 0, 0)
    val dy = arrayOf(0, 0, 1, -1)

    var size = Pair(5, 5)

    fun validCheck(x: Int, y: Int): Boolean =
        (x < 0 || y < 0 || x >= size.first || y >= size.second)

    fun bfs(classNo:Int, map: Array<String>, start: Pair<Int, Int>): Boolean {
        var flag = false
        val queue: Queue<Pair<Int, Int>> = LinkedList()
        queue.add(start)
        visited[classNo][start.first][start.second] = true

        while (queue.isNotEmpty()) {
            val cur = queue.remove()
            for (i in 0 until 4) {
                val x = cur.first + dx[i]
                val y = cur.second + dy[i]

                if (validCheck(x, y) || visited[classNo][x][y]) continue
                visited[classNo][x][y] = true
                when (map[x][y]) {
                    'O' -> {
                        classDistance[classNo][x][y] = classDistance[classNo][cur.first][cur.second] + 1
                        queue.add(Pair(x, y))
                    }
                    'P' -> {
                        if(classDistance[classNo][cur.first][cur.second] + 1 <= 2){
                            isOk[classNo] = false
                            return true
                        }
                        queue.add(Pair(x, y))
                    }
                }
            }
        }
        return flag
    }

    fun solution(places: Array<Array<String>>): IntArray {
        val answer = mutableListOf<Int>()

        places.forEachIndexed { classNo, strings -> (0 until 5).forEach{ i -> repeat(5){k ->
            if(!visited[classNo][i][k] && places[classNo][i][k] == 'P' && bfs(classNo, places[classNo], Pair(i, k))) return@repeat
        } } }
        isOk.forEach { answer.add(if(it) 1 else 0) }

        return answer.toIntArray()
    }

}

'ProblemSolving' 카테고리의 다른 글

[BOJ] 2470 두 용액  (0) 2022.05.21
[프로그래머스] [3차] 파일명 정렬  (0) 2022.05.20
[BOJ] 4375 1  (0) 2022.05.19
[BOJ] 2193 이친수  (0) 2022.05.18
[BOJ] 1245_농장 관리  (0) 2022.05.15
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기