본문 바로가기

PS/BaekJoon

[C++/2115] 갤러리


 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.


가로 세로 줄마다 벽이 어느정도 이어져 있는지 파악하면 되는 문제입니다. 정답률이 굉장히 높기 때문에 도전했습니다. 저번에는 정답률이 20~30%정도의 문제만 풀었는데, 이런 문제도 풀어야하지 않을까요? 해서 풀었습니다. 근데 매번 낮은 문제만 풀다보니 정답률이 높아도 의심이 가더라고요 그래서 심사숙고해서 문제를 풀었습니다.

해당 문제에서는 벽2칸에 그림 하나를 걸 수 있는데, 그런 벽이 몇개 있는지 알아야합니다. 그래서 연속적으로 어떻게 벽이 이루어져 있는지 파악하는 문제입니다. 그래서 구현을 깔끔하게 해줘야합니다.

입력값도 1<= M,N <= 1000이기 때문에, 입력값에서는 큰 문제가 없습니다. 그래서 문제 해결에는 어려운 점이 없습니다. 단 구현만 집중해서 해결해주면 됩니다.


#include<iostream>
#include<vector>

#define MAX 1010
using namespace std;

const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0}; // down, up, right, left

int m,n;
char board[MAX][MAX];

vector<int> v;

int isRange(int y, int x){
	return 0 <= y && y < m && 0 <= x && x < n;
}

void init(){
	
	cin >> m >> n;
	
	for(int i = 0; i < m; i++){
		for(int j = 0; j < n; j++){
			cin >> board[i][j];
		}
	}

}

void rowPicture(){

	// down, up, right, left
	for(int i = 0; i < m; i++){
		
		int upLength = 0, downLength = 0;
		
		for(int j = 0; j < n; j++){
			
			if(board[i][j] == '.'){
				
				for(int k = 0; k < 2; k++){
					
					int ny = i + dy[k];
					if(!isRange(ny,j)) continue;
					
					if(board[ny][j] == 'X'){
						if(k == 0){
							downLength++;
						} else {
							upLength++;
						}
					} else if(board[ny][j] == '.'){
						if(k == 0){
							v.push_back(downLength);
							downLength = 0;
						} else{
							v.push_back(upLength);
							upLength = 0;
						}
					}
				}
				
			} else if(board[i][j] == 'X'){
				
				v.push_back(upLength);
				v.push_back(downLength);
				
				upLength = 0;
				downLength = 0;
				
			}
		}
		
		v.push_back(upLength);
		v.push_back(downLength);
		
	}

}

void colPicture(){
	
	for(int i = 0; i < n; i++){
		
		int leftLength = 0, rightLength = 0;
		
		for(int j = 0; j < m; j++){
			
			if(board[j][i] == '.'){
				
				for(int k = 2; k < 4; k++){
					
					int nx = i + dx[k];
					if(!isRange(j,nx)) continue;
					
					if(board[j][nx] == 'X'){
						if(k == 2){
							rightLength++;
						} else {
							leftLength++;
						}
					} else if(board[j][nx] == '.'){
						if(k == 2){
							v.push_back(rightLength);
							rightLength = 0;
						} else{
							v.push_back(leftLength);
							leftLength = 0;
						}
					}
				}
				
			} else if(board[j][i] == 'X'){
				
				v.push_back(rightLength);
				v.push_back(leftLength);
				
				rightLength = 0;
				leftLength = 0;
				
			}
		}
		
		v.push_back(rightLength);
		v.push_back(leftLength);
		
	}
}

int main() {
	
	init();
	rowPicture();
	colPicture();
	
	int answer = 0;
	for(int i = 0; i < v.size(); i++){
		if(v[i] == 0) continue;
		//cout << v[i] << " ";
		answer += (v[i] / 2);
	}
	//cout << "\n";
	cout << answer;

	return 0;
}

'PS > BaekJoon' 카테고리의 다른 글

[C++/28066] 타노스는 요세푸스가 밉다.  (0) 2024.06.30
[C++/28256] 초콜릿 보관함  (0) 2024.06.27
[C++/23796] 2,147,483,648 게임  (0) 2024.06.19
[C++/25565] 딸기와 토마토  (0) 2024.06.19
[C++/5766] 할아버지는 유명해!  (0) 2024.06.17