[백준 1926] 그림 문제 복습 (실수 최종 수정)

2023. 3. 31. 22:36자료구조 및 알고리즘/백준

728x90

공백으로 숫자를 받아서 2차원 배열 board의 각 요소의 값을 정하는 방법

// board 입력 받는 방식1 - 모르는 부분 check
	for(int i=0; i<n; i++)
		for (int j = m; j < m; j++)
			cin >> board[i][j];

 

그리고 pop한 만큼 area++ 해서 넓이를 늘려줘야 되는데,

for(int dir=0; dir<4; dir++)문안에서 push한 걸로 하면은 숫자 1이 모자란다. while(!Q.empty()) 윗 문장에 Q.push({i,j})가 있기 때문에

if (vis[i][j] == 0 && board[i][j] == 1) {
				vis[i][j] = 1; // 시작점 표시
				num++; // 그림 수 늘어나고

				int area = 0; // 넓이는 0부터 시작하고
				queue<pair<int, int>> Q; // pair<int,int>를 자료형으로 갖는 큐 선언
				Q.push({ i,j });

				while (!Q.empty()) {
					pair<int, int> cur = Q.front(); Q.pop();
					area++; // pop하는 것만큼 - push로 하면 저 위에서 push한게 있어서 문제가 생김
					for (int dir = 0; dir < 4; dir++) {
						int nx = cur.X + dx[dir];
						int ny = cur.Y + dy[dir];
						if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
						if (vis[nx][ny] || board[nx][ny] != 1) continue;
						vis[nx][ny] = 1;
						Q.push({ nx, ny });
	
					}
				}
				mx = max(area, mx);
			}

 

그래서 전체 코드는

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

using namespace std;
#define X first
#define Y second
int board[502][502];
bool vis[502][502];

int n, m;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> n >> m;
	
	// board 입력 받는 방식1 - 모르는 부분 check
	for(int i=0; i<n; i++)
		for (int j = m; j < m; j++)
			cin >> board[i][j];
	

	int num = 0; // 그림의 수
	int mx = 0; // 그림의 최댓값

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (vis[i][j] || board[i][j] == 0) continue;
				
				num++; // 그림 수 늘어나고

				
				queue<pair<int, int>> Q; // pair<int,int>를 자료형으로 갖는 큐 선언6
				vis[i][j] = 1; // 시작점 표시
                Q.push({ i,j });
                int area = 0; // 넓이는 0부터 시작하고
				while (!Q.empty()) {
                    area++;
					pair<int, int> cur = Q.front(); Q.pop();
					 // pop하는 것만큼 - push로 하면 저 위에서 push한게 있어서 문제가 생김
					for (int dir = 0; dir < 4; dir++) {
						int nx = cur.X + dx[dir];
						int ny = cur.Y + dy[dir];
						if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
						if (vis[nx][ny] || board[nx][ny] != 1) continue;
						vis[nx][ny] = 1;
						Q.push({ nx, ny });
	
					}
				}
				mx = max(area, mx);
		}
	}
		
	cout<<num<<'\n'<<mx;
	
}

 

이 코드로 하니까 결과가 무조건 0 0 나오는데 어떡하지ㅠㅠㅠ

 

아래 코드는 main 코드 5줄 (ios부터 board 입력 받는 부분까지)만 바킹독님꺼 복붙했는데, 돌아가서 이상해ㅜㅜ

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

using namespace std;
#define X first
#define Y second
int board[502][502];
bool vis[502][502];

int n, m;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };

int main(void) {

    
    ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for(int i = 0; i < n; i++)
    for(int j = 0; j < m; j++)
      cin >> board[i][j];
    
  int mx = 0; // 그림의 최댓값
  int num = 0; // 그림의 수
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (vis[i][j]==0 && board[i][j] == 1){
				
				num++; // 그림 수 늘어나고
				queue<pair<int, int>> Q; // pair<int,int>를 자료형으로 갖는 큐 선언6
				vis[i][j] = 1; // 시작점 표시
                Q.push({ i,j });
                int area = 0; // 넓이는 0부터 시작하고
				while (!Q.empty()) {
                    area++;
					pair<int, int> cur = Q.front(); Q.pop();
					 // pop하는 것만큼 - push로 하면 저 위에서 push한게 있어서 문제가 생김
					for (int dir = 0; dir < 4; dir++) {
						int nx = cur.X + dx[dir];
						int ny = cur.Y + dy[dir];
						if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
						if (vis[nx][ny] || board[nx][ny] != 1) continue;
						vis[nx][ny] = 1;
						Q.push({nx, ny});
	
					}
				}
				mx = max(area, mx);
            }
		}
	}
		
	cout<<num<<'\n'<<mx;
	
}

 

실수 이유는 - https://www.acmicpc.net/board/view/114670#comment-179759

 

글 읽기 - 출력이 0 0 으로 찍히는 이유를 모르겠습니다.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

20번째 줄 for문 잘못 설정함ㅋㅋㅋ

728x90