본문 바로가기
개발 노트/백준, 프로그래머스 풀이

[백준 1018/c++] 체스판 다시 칠하기

by tokkiC 2022. 7. 5.

이중 벡터를 사용하는 문제이다

vector<vector<int>> ar(n, vector<int>(m));  // (m) 대신 (m, 5)를 넣으면 내부 값을 5로 초기화 한다

위의 코드는 아래에서 쓴 것인데, 벡터안에 벡터<int>를 넣었고, ar 이라는 벡터명이며

ar[n][m] 의 크기를 갖는 이중 벡터를 선언, 데이터를 입력하여 문제에 사용하였다

8x8 인덱스 내에서 돌때 가로 인덱스+세로 인덱스의 합이 짝수, 홀수일때를 각각 이용해서 비교하였고

bw wb 의 경우를 따로 두 번 돌지 않고 한번의 확인으로 b로 바꿀때 w로 바꿀때를 모두 체크해서

두 경우를 함께 카운트 하여 개선하였다

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;

int main(){
	
	int n,m,mini;
	int bcnt=0;
	int wcnt=0;
	string s;
	vector<int> v;
	
	cin>>n>>m;
	
    // 아래처럼 이중 벡터로 크기를 정할 시, n m 의 크기 제한에
    // 상관없이 코드가 작동한다
    // 이 문제는 m n 각각 최대값이 50으로 최대 50x50 의 문제이므로
    // 이중 벡터가 아닌 최대일때를 이중 배열로 [50][50]하여 크기를 정하고
    // 사용할 수도 있다. 하지만 50 이상에도 문제없도록 벡터가 더 나아보인다
    
	vector<vector<int>> ar(n, vector<int>(m));
	
	for(int i=0; i<n; i++){
		cin>>s;
		for(int j=0; j<m; j++){
			if(s[j]=='B')
				ar[i][j]=0;
			else
				ar[i][j]=1;
		}
	}

	// 한번의 루프에서 bw wb 일때 변화의 수를 각각 카운트하여
    // 각 카운트 수를 따로 세어 반복의 수를 줄여 개선시킨 코드이다
	for(int i=0; i+7<n; i++){
		for(int j=0; j+7<m; j++){
			
			for(int k=i; k<i+8; k++){
				for(int l=j; l<j+8; l++){
					
					if((k+l)%2==0){
						if(ar[k][l]!=0){
							bcnt++;
						} else {
							wcnt++;
						}
					}
					if((k+l)%2==1){
						if(ar[k][l]==0){
							bcnt++;
						} else {
							wcnt++;
						}
					}
				}
			}
			v.emplace_back(bcnt);
			v.emplace_back(wcnt);
			bcnt=0;
			wcnt=0;
			
// ---bw 와 wb 순서를 각각 구하려 한것이 아래이다---
//
//			for(int k=i; k<i+8; k++){
//				for(int l=j; l<j+8; l++){
//					if((k+l)%2==0){
//						if(ar[k][l]!=1){
//							wcnt++;
//						}
//					}
//					if((k+l)%2==1){
//						if(ar[k][l]==1){
//							wcnt++;
//						}
//					}
//				}
//			}
//			v.emplace_back(cnt);
//			bcnt=0;
//			wcnt=0;
		}
	}
	
	mini=*min_element(v.begin(), v.end());	
	cout << mini << "\n";	
	return 0;
}

댓글