Link
Notice
HIT해
[JS 백준] 2630.색종이 만들기 본문
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]);
}
'Vue > JavaScript 알고리즘' 카테고리의 다른 글
[JS 프로그래머스] 큰수구하기 (0) | 2024.01.18 |
---|---|
[JS 백준] 1654.랜선 자르기 (0) | 2024.01.15 |
[JS 백준] 1780.종이의 개수 (1) | 2024.01.14 |
[JS 프로그래머스] 2024 KAKAO_가장 많이 받은 선물 (0) | 2024.01.14 |
[JS 프로그래머스] [PCCP 기출문제] 1번 / 붕대 감기 (0) | 2024.01.11 |