HIT해

[JS 백준] 2630.색종이 만들기 본문

Vue/JavaScript 알고리즘

[JS 백준] 2630.색종이 만들기

힛해 2024. 1. 14. 22:34
728x90

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

 

2630번: 색종이 만들기

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

www.acmicpc.net

바로 이전에 풀었던 종이의 개수와 완전 똑같은 문제다.

 

하지만 문법 및 분할정복 개념 숙련도를 높이기 위해 클론코딩없이 만들어 보았다.

 

하지만 또 틀린 부분이 있었는데 바로 이부분이다.

paper = paper.map(r => r.replace('\r','').split(' '));

 

정리를 하자

map은 배열안의 배열을 괄호 안의 규칙으로 만들 떄 사용한다.

 

위의 경우 paper배열값들을 또 쪼개는건데. 공백을 '' 바꾸고 ' '을 기준으로 나눠서 저장한다.

 

잊지말자..

 

풀이 코드다.

const filePath = process.platform === 'linux' ? '/dev/stdin' : 'input.txt';

let [N,...paper] = require("fs")
  .readFileSync(filePath)
  .toString()
  .trim().split('\n');

N = +N; // 숫자형변환
paper = paper.map(s=>s.replace('\r','').split(' '));
let result = [0,0];

//분할정복 함수
const devideConquer = (column, row, length) =>{
    let num = paper[column][row];
    if(check(column,row,length)){
        if(num === '0'){
            result[0]++;
        }else{
            result[1]++
        }
    }else{
        let newLength = length/2;
        for(let i = 0; i <2; i++){
            for(let j = 0; j< 2; j++){
                devideConquer(column + newLength*i, row + newLength*j, newLength);
            }
        }
    }
}

//체크 함수
const check = (column, row, length) =>{
    let firstNum = paper[column][row];
    for(let i = 0; i < length; i++){
        for(let j = 0; j<length; j++){
            if(firstNum !== paper[column+i][row+j]){
                return false;
            }
        }
    }
    return true;
}

devideConquer(0,0,N);

for(let i = 0; i < 2; i++){
    console.log(result[i]);
}