본문 바로가기

CodingTest/백준알고리즘BOJ

백준알고리즘JS_유기농배추(DFS)

// https://bitwise.tistory.com/70

dx = [-1,0,1,0]
dy = [0,1,0,-1]

function solve(){
    var fs = require('fs');
    // var input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
    var input = fs.readFileSync('js/test.txt').toString().trim().split('\n');
    // 테스트 케이스 갯수 정보 받아들이기 
    var t = parseInt(input[0])
    input.shift() // 테스트케이스 갯수 정보 삭제 
    var count = 0 
    var i = 1
    var answer = []
    let cabbageLocation

    while( t != count){

        var testCaseInfo = input[i-1].split(' ')
        var numOfCol = parseInt(testCaseInfo[0]) // 가로 길이 
        var numOfRow = parseInt(testCaseInfo[1]) // 세로 길이 
        var k = parseInt(testCaseInfo[2]) // 배추가 심어진 위치의 갯수
        var eachCnt = 0

        // arr[n][m]
        cabbageLocation = Array.from(Array(numOfRow), () => Array(numOfCol).fill(0))
        for(var c = i; c< k + i; c++){
            var temp = input[c].split(' ').map((element)=> element/1)
            var col = temp[0]
            var row = temp[1]
            cabbageLocation[row][col] = 1
        }
        
        // 배추 dfs
        for(let i = 0 ; i < numOfRow ; i++){
            for(let j = 0 ; j < numOfCol ; j++){
                if(cabbageLocation[i][j] == 1){
                    // 방문 처리
                    cabbageLocation[i][j] = 0
                    dfs(i,j)
                    eachCnt++
                }
            }
        }
        console.log(eachCnt)
        i += k + 1 // 다음 테스트 케이스를 위해 인텍스 조정
        count ++
    }

    function dfs(nowX,nowY){
    
        for(let k = 0 ; k < 4 ; k++){
            newX = nowX + dx[k]
            newY = nowY + dy[k]
            if( ( 0 <= newX && newX < numOfRow)  && ( 0 <= newY && newY  < numOfCol ) ){
                if(cabbageLocation[newX][newY] == 1){
                    // 방문 처리
                    cabbageLocation[newX][newY] = 0
                    // dfs
                    dfs(newX, newY)
                }
            }
        }
    }

}



solve()