이중 벡터를 사용하는 문제이다
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
#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;
}
'개발 노트 > 백준, 프로그래머스 풀이' 카테고리의 다른 글
[백준 10845/c++] 큐 (0) | 2022.07.07 |
---|---|
[백준 11729/c++] 집합 (0) | 2022.07.06 |
[백준 1764/c++] 듣보잡 (0) | 2022.07.05 |
[백준 11729/c++] 하노이의 탑 이동 순서 (0) | 2022.07.03 |
[백준 12871/c++] 무한 문자열 (0) | 2022.07.02 |
댓글