본문 바로가기
알고리즘

색종이 만들기 (dfs)

by limew 2023. 9. 23.

 

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

 

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.

www.acmicpc.net

  • 여러줄 입력 split('\n')
  • map(e => Number(e)) === map(Number)
  • 0항 0열부터 돌면서 isUnion을 검사한다
    • isUnion이거나 더이상 자를 수 없는 조각이면 왼쪽상단모서리가 1일떈 blue++, 0일땐 white++
    • !isUnion이면 한 변이 n/2크기로 잘라서 다시 isUnion검사를 한다

 

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

let [N, ...paper] = input;
paper = paper.map(p => p.split(' ').map(Number));
let white = 0;
let blue = 0;

function solution(r, c, n) {
    // 통일된 색이던가 색종이를 더이상 자를 수 없을 시
    if (isUnion(r, c, n) || n === 1) {
        if (paper[r][c] === 1) blue++;
        else white++;
        return;
    } 
    // 다른색이 섞이면 n/2씩 나눠서 다시 isUnion한지 검사
    const half = n/2;
    solution(r, c, half);
    solution(r+half, c, half);
    solution(r, c+half, half);
    solution(r+half, c+half, half);
}

function isUnion(r, c, n) {
    const first = paper[r][c];
    for (let i = r; i < r+n; i++) {
        for (let j = c; j < c+n; j++) {
            // 같은 색이 아님
            if (paper[i][j] !== first) return false;
        }
    }
    return true;
}

solution(0, 0, N);
console.log(`${white}\n${blue}`);

'알고리즘' 카테고리의 다른 글

MST 최소비용신장트리, Union find 개념과 JS코드  (0) 2023.09.25
[dfs, union find] 네트워크  (0) 2023.09.25
[그리디] 체육복  (0) 2023.09.20
[DP] N으로 표현  (0) 2023.09.03
[DP] 등굣길  (0) 2023.09.01