반응형
문자열 벡터가 만약
"TTTANT"
"RRFACC"
"RRRFCC"
"TRRRAA"
"TTMMMF"
"TMMTTJ"
이런식으로 주어졌다고 가정하자.
난 이것을 오른쪽으로 90도 회전했다.
이런식으로 돌려서 위에서부터 차례대로 v[0]의 문자열 ~ v[5]의 문자열로 생각하는 것이다. (쉽게 생각할 수 있도록!)
벡터 v를 하나하나씩 살펴보는데 정사각형 2X2 라는 점을 고려해서,
현재 원소에서 오른쪽, 아래쪽, 오른쪽+아래쪽을 확인해야하기 때문에 반복문에서는
열과 행을 하나씩 빼준값 까지 돌아야한다.
각 벡터의 문자열들의 사이즈가 1보다 같거나 작으면 애초에 비교대상이 되지 않으니까 continue 해준다.
그리고 map이라는 이차원 맵을 생성하여 서로 같은 원소가 총 4개가 나오면 map의 해당 인덱스의 값에 1로 세팅하면서 후에 지워야 할 원소라는 것을 기록해둔다.
모든 원소를 다 돌아보고 난후에 map에 1로 설정 되어있는 값의 인덱스 번호는 v 벡터 문자열에서 지워야할 문자의 인덱스라고 판단하면 된다. 그리고 v벡터의 지워야 할 문자들을 없애고 새로 갱신해준다.
#include <string>
#include <vector>
using namespace std;
int solution(int m, int n, vector<string> board) {
int answer = 0;
vector <string> v;
for(int i=0; i<n; i++){ //map 뒤집기
string s= "";
for(int j=m-1; j>=0; j--)s+=board[j][i];
v.push_back(s);
}
while(1){
vector<vector<int>>map(n, vector<int>(m,0));
int ch=0;
for(int i=0; i<v.size()-1; i++){
if(v[i].size()<=1||v[i+1].size()<=1)continue;
for(int j=0; j<v[i].size()-1; j++){
if(j>=v[i+1].size()-1)continue;
else{
char c = v[i][j];
if(c==v[i][j+1]&&c==v[i+1][j]&&c==v[i+1][j+1]){
map[i][j]=map[i][j+1]=map[i+1][j]=map[i+1][j+1]=1;
ch=1;
}
}
}
}
if(!ch)break;
for(int i=0; i<v.size(); i++){
string s="";
for(int j=0; j<v[i].size(); j++){
if(map[i][j]==0) s+=v[i][j];
else answer++;
}
v[i]=s;
}
}
return answer;
}
반응형
'프로그래머스 > Level_2' 카테고리의 다른 글
[Level_2 / C++ / 카카오] 문자열 압축 (0) | 2022.01.24 |
---|---|
[Level_2 / C++ / 카카오] [1차] 캐시 (0) | 2022.01.24 |
[Level_2 / C++ / 카카오] 수식 최대화 (0) | 2022.01.20 |
[Level_2 / C++ / 카카오] 튜플 (0) | 2022.01.19 |
[Level 2] 가장 큰 수 (C++) (0) | 2022.01.17 |
댓글