프로그래머스/2레벨

[프로그래머스/C++] 카카오프렌즈 컬러링북

Koalitsiya 2024. 3. 12. 16:03
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

  • 단순한 bfs 문제
  • 연결된 같은 색상으로 이루어진 영역의 개수와, 가장 넓은 영역의 넓이를 구하는 문제

> 정답률이 낮아서 좀 난이도가 있는 문제인가 싶었는데 열어보니 그냥 bfs로 해결하면 되는 문제였다.

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

int dirX[4] = {0, 1, 0, -1};
int dirY[4] = {1, 0, -1, 0};
bool visited[101][101];

//bfs
int bfs(int i, int j, int m, int n, vector<vector<int>> picture) {
    int color = picture[i][j];
    int size = 1;
    queue<pair<int, int>> q;
    q.push({i, j});
    visited[i][j] = true;
    
    while(!q.empty()) {
        int curX = q.front().first;
        int curY = q.front().second;
        q.pop();
        
        // 4방향으로 이동
        for(int i = 0; i < 4; i++) {
            int nx = curX + dirX[i];
            int ny = curY + dirY[i];
            
            if(nx >= 0 && nx < m && ny >= 0 && ny < n) {
                // 다음으로 방문한 좌표의 색상이 color와 같고 방문한 적 없으면
                if(picture[nx][ny] == color && !visited[nx][ny]) {
                    // 방문 여부 갱신
                    visited[nx][ny] = true;
                    // 방문 좌표 갱신
                    q.push({nx, ny});
                    // 영역 너비 증가
                    size++;
                }
            }
        }
    }
    
    return size;
}

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
vector<int> solution(int m, int n, vector<vector<int>> picture) {
    int number_of_area = 0;
    int max_size_of_one_area = 0;
    
    // 방문 배열 초기화
    for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++)
            visited[i][j] = false;
    
    // 색이 칠해져 있고 방문한적 없으면 bfs 수행
    for(int i = 0; i < m; i++) {
        for(int j = 0; j < n; j++) {
            if(picture[i][j] != 0 && !visited[i][j]) {
                // 가장 넓은 영역 구하기
                max_size_of_one_area = max(max_size_of_one_area, bfs(i, j, m, n, picture));
                // 영역 개수 증가
                number_of_area++;
            }
        }
    }
    
    vector<int> answer(2);
    answer[0] = number_of_area;
    answer[1] = max_size_of_one_area;
    
    return answer;
}