백준 2630번 색종이 만들기 [DFS]

2026. 2. 13. 15:08·Coding Test/DFS

문제

 

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------

 

문제 접근 순서.

 

1. 처음에 문제를 접했을 때 문제를 해결 방식을 소분화 하여 생각했다.

    어떻게 검사를 시작할지 ( ex 모든 색종이가 파란색 or 하얀색 /  색종이를 어떻게 분할 할지 등) 

 

2. 계속 생각하던 중 색종이가 계속 자기 분열 즉 재귀적으로 계속 분할하는 것을 볼 수 있어서 

    DFS 알고리즘이 생각났다. 

 

3.  따라서 DFS 알고리즘을 사용하며 해당 색종이가 분할하면 4개의 색종이가 생기므로 

     DFS 안에서 다시 4개의 DFS를 호출하는 방안을 생각했다. 

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------

 

코드

#include <iostream>
#include <vector>
using namespace std;

vector<vector<int>> paper;
int whiteCnt = 0;
int blueCnt = 0;

void dfs(int r, int c, int size)
{
    int color = paper[r][c];
    bool same = true;

    // 현재 영역이 모두 같은 색인지 검사
    for (int i = r; i < r + size; i++)
    {
        for (int j = c; j < c + size; j++)
        {
            if (paper[i][j] != color)
            {
                same = false;
                break;
            }
        }
        if (!same) break;
    }

    // 모두 같은 색이면 카운트 후 종료
    if (same)
    {
        if (color == 0) whiteCnt++;
        else blueCnt++;
        return;
    }

    // 아니면 4등분
    int half = size / 2;

    dfs(r, c, half);                 // 왼쪽 위
    dfs(r, c + half, half);          // 오른쪽 위
    dfs(r + half, c, half);          // 왼쪽 아래
    dfs(r + half, c + half, half);   // 오른쪽 아래
}

int main()
{
    int n;
    cin >> n;

    paper.assign(n, vector<int>(n));

    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> paper[i][j];

    dfs(0, 0, n);

    cout << whiteCnt << "\n";
    cout << blueCnt << "\n";

    return 0;
}

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

다시 풀어본  코드

 

#include <iostream>
#include <vector>

using namespace std; 

int g_WhiteCount = 0; 
int g_BlueCount = 0;

void DFS(vector<vector<int>>& _vec, int _iStart_Row, int _iStart_Col, int _iSize)
{
	int  thisPaperColor = _vec[_iStart_Row][_iStart_Col];
	bool bAllPaperColorSame = true; 

	for (int i = _iStart_Row; i < _iStart_Row +_iSize; i++)
	{
		for (int j = _iStart_Col; j<_iStart_Col+_iSize; j++)
		{
			if (thisPaperColor != _vec[i][j])
			{
				bAllPaperColorSame = false;
				break;
			}
			if (!bAllPaperColorSame)
				break;
		}
	}

	if(bAllPaperColorSame)
	{
		switch (thisPaperColor)
		{
		case 0:
			g_WhiteCount++;
			break;
		case 1:
			g_BlueCount++;	
			break;
		}

		return;
	}

	int iNextSize = _iSize / 2;

	DFS(_vec, _iStart_Row, _iStart_Col, iNextSize); // 왼 위 
	DFS(_vec, _iStart_Row + iNextSize, _iStart_Col, iNextSize); // 오른 위
	DFS(_vec, _iStart_Row , _iStart_Col + iNextSize, iNextSize); // 왼 아래 
	DFS(_vec, _iStart_Row + iNextSize, _iStart_Col + iNextSize, _iSize / 2); // 오른 아래 


	
}

int main()
{
	int i_WhiteCount = 0; 
	int i_BlueCount = 0;
	int i_inputLineSize = 0; 
	cin >> i_inputLineSize; 

	vector<vector<int>> m_vecPaper(i_inputLineSize, vector<int>(i_inputLineSize,0));

	int row = i_inputLineSize;
	int col = i_inputLineSize; 

	
	for (int i = 0; i < row; i++) 
	{
		for(int j=0; j <col; j++)
		{
			cin >> m_vecPaper[i][j]; 
		}
	}

	
	DFS(m_vecPaper, 0,0,i_inputLineSize);


	cout << g_WhiteCount << "\n";
	cout << g_BlueCount;







	return 0;
}

'Coding Test > DFS' 카테고리의 다른 글

프로그래머스 [Level2] 소수 찾기 [DFS]  (0) 2025.11.11
프로그래머스 타겟넘버 문제 ( DFS 알고리즘)  (0) 2025.11.03
'Coding Test/DFS' 카테고리의 다른 글
  • 프로그래머스 [Level2] 소수 찾기 [DFS]
  • 프로그래머스 타겟넘버 문제 ( DFS 알고리즘)
seonhwan2547
seonhwan2547
seonhwan2547 님의 블로그 입니다.
  • seonhwan2547
    seonhwan2547 님의 블로그
    seonhwan2547
  • 전체
    오늘
    어제
    • 분류 전체보기 (80)
      • Unreal Project (17)
        • Khazan 모작 프로젝트 (2)
        • Unreal Study (10)
        • Blueprint (5)
      • Directx11 Project (11)
        • Thymesia 팀 프로젝트 (8)
        • Kaku Ancient Seal 개인 프로젝트 (2)
        • Thymesia Animation Tool 개발 (0)
      • Algorithm (6)
        • Binary_Search (2)
        • Greedy (1)
        • Dynamic Programming (1)
        • A-star (1)
      • Coding Test (31)
        • Brutal Force (2)
        • Sort (5)
        • DFS (3)
        • Binary_Search (4)
        • BFS (6)
        • Hash (2)
        • Dynamic Programming (6)
        • Greedy (1)
        • BackTracking (1)
        • Binary_Tree (1)
      • STL Container (1)
        • unorded_set (0)
        • priority_queue (1)
      • C++ 공부 및 몰랐던점 (8)
        • Smart pointer (1)
      • Visual Studio 설정관련 공부 (1)
      • Console Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 블로그 소개
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CodingTest
    Game Programming
    Unreal Engine
    hash
    Unreal
    blueprint
    GameProgramming
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
seonhwan2547
백준 2630번 색종이 만들기 [DFS]