[백준] 2630번 - 종이의 개수

2024. 10. 12. 00:25·알고리즘/재귀

[2630] 종이의 개수

[Baekjoon 문제 링크]

재귀를 사용하는 문제인 2630번을 풀어보았다.

 

 

우선 종이를 자르는 함수(재귀 함수)를 만들어야 하는데, 나는 cutPaper라는 이름으로 만들었다.
cutPaper 함수 안에서는 종이를 구성하는 숫자가 모두 동일한지 확인하여 아래와 같이 처리해줘야 한다.

  • 종이가 모두 같은 수로 되어 있는 경우(same) : 종료 조건이다. 빈도수만 증가시킨 후 return한다.
  • 같은 수로 되어 있지 않은 경우(!same): 현재의 색종이를 4분할 한 후(행 2등분, 열 2등분) 각각에 대해 다시 cutPaper 함수를 호출한다.

 

자세한 구현 아이디어는 아래 글에 작성해 놓았다. 코드가 진짜 똑같아서 구현 아이디어도 완전 동일하다. 단 분할 개수만 다르다! (아래 글의 문제는 9등분이다. )

2024.10.11 - [분류 전체보기] - [재귀] 백준 1780번 - 종이의 개수

 

코드 설명

const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'Wiki\\input.txt';
const [N, ...paper] = fs.readFileSync(path).toString().trim().split('\n').map(row => row.split(' ').map(Number));


let answer = [0, 0]; //answer[0] : 0의 빈도수 / answer[1] : 1의 빈도수

const cutPaper = (rowStart, colStart, size) => {

    // 색종이 왼쪽 위 꼭짓점의 인덱스
    const first = paper[rowStart][colStart];
    let isSame = true;

    // 색종이 안에 있는 모든 숫자를 확인하며
    for(let r = rowStart; r < rowStart + size; r++ ){
        for(let c = colStart; c < colStart + size; c++) {
            // 하나라도 첫 번째 요소와 다른게 있다면, isSame은 false
            if(first !== paper[r][c]) {
                isSame = false;
                break;
            }
        }
        if(!isSame) {
            break;
        }
    }    

    if (isSame) { //모든 요소가 같다면? -> 종료 조건

        // 색종이 종류 확인 후 빈도수 증가 (-1인지, 0인지, 1인지)
        answer[first]++;
        return;
    } else {

        // 4개의 색종이를 만들어 cutPaper 다시 호출!
        size /= 2; //자르니까 가로,세로 모두 1/2 사이즈가 된다.
        for(let i = 0; i < 2; i++) {
            for(let j = 0; j < 2; j++) {
                cutPaper(rowStart + i * size , colStart + j * size, size);
            }
        }
    }
};

cutPaper(0, 0, N);
console.log(answer.join('\n'));

이 문제 풀 수 있으면 1780, 1992는 코드 복붙해서 좀만 수정하면 풀 수 있다. 완전 럭키비키쟈나🍀

'알고리즘 > 재귀' 카테고리의 다른 글

백준 1074번 Z (javascript)  (0) 2024.10.14
[백준 11729번] - 하노이 탑 이동 순서 (javascript)  (1) 2024.10.12
[재귀] 백준 1780번 - 종이의 개수  (0) 2024.10.11
'알고리즘/재귀' 카테고리의 다른 글
  • 백준 1074번 Z (javascript)
  • [백준 11729번] - 하노이 탑 이동 순서 (javascript)
  • [재귀] 백준 1780번 - 종이의 개수
뜐🐸
뜐🐸
패왕색 패기를 갖춘 뜐입니다~
  • 뜐🐸
    뜐의 개발 로그
    뜐🐸
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 기초 학습
        • HTML
        • CSS
        • JavaScript
        • Version Co..
        • 미니 프로젝트
        • DOM & 웹 AP..
      • CSS 프레임워크
        • Bootstrap
      • React
        • 개념 정리
        • 기초 정리
      • 알고리즘
        • Week 1: 입출..
        • 재귀
        • 백트래킹
      • javascript
      • FastAPI
        • 크롤링 서버 만들기
      • 전역 상태 관리
        • Redux
      • 한 입 리액트 챌린..
      • 영어
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    inline-block
    :hover
    :nth-child(n)
    백준 #코딩테스트 #1074번 #재귀 #알고리즘 # 알고리즘 문제풀이
    오블완
    티스토리챌린지
    :focus
    가상 선택자
    :active
    자바스크립트 #하노이 탑 #재귀 #백준 # 11729
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
뜐🐸
[백준] 2630번 - 종이의 개수
상단으로

티스토리툴바