알고리즘 문제 풀기

백준 14500: 테트로미노 - javascript (완탐, dfs)

Fo_rdang 2024. 10. 15. 15:29
반응형

문제 출처 

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

 

정답 풀이 

테트로미노 다섯가지 모양을 보면, dfs 탐색으로 커버 가능하다는 것을 알 수 있다. 

단, ㅗ 모양 빼고 ! 

 

- 따라서 dfs 를 통해 cnt가 4가 될 때까지 탐색하고, 

- 최대 합을 구한다. 

- 따로, 'ㅗ','ㅏ',ㅜ'','ㅓ' 모양일 때 전체 합을 구한다. 

정답 코드 

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n'); 
const [n, m] = input.shift().split(' ').map(v => +v); 
const graph = input.map(el => el.split(' ').map(v => +v));

const dx = [-1, 1, 0, 0]; 
const dy = [0, 0, -1, 1]; 
let max = 0; 

const visited = Array.from({ length: n }, () => new Array(m).fill(false));

for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
        visited[i][j] = true; 
        dfs(i, j, graph[i][j], 1);
        visited[i][j] = false;
        check(i, j); 
    }
}

console.log(max);

function dfs(x, y, sum, cnt) {
    if (cnt === 4) {
        max = Math.max(max, sum);
        return; 
    }

    for (let d = 0; d < 4; d++) {
        const nx = x + dx[d]; 
        const ny = y + dy[d]; 

        if (nx < 0 || ny < 0 || nx >= n || ny >= m || visited[nx][ny]) continue; 

        visited[nx][ny] = true;
        dfs(nx, ny, sum + graph[nx][ny], cnt + 1);   
        visited[nx][ny] = false;
    }
}

// 'ㅗ', 'ㅜ', 'ㅏ', 'ㅓ' 모양을 처리하기 위한 함수
function check(x, y) {
    const shape = [
        [[0,1],[-1,1],[0,2]],//ㅗ
        [[0,1],[1,1],[0,2]],//ㅜ
        [[1,0],[1,1],[2,0]],//ㅏ
        [[1,0],[1,-1],[2,0]],//ㅓ
    ]
    for(let el of shape){
       let sum = graph[x][y] 
       for(let [dx, dy] of el){
           const nx = x+dx
           const ny = y+dy
           if(nx < 0 || ny < 0 || nx >= n || ny >= m) break; 
           sum+= graph[nx][ny]
       }
        max = Math.max(max, sum)
    }
}
반응형