⛔ 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.
가로 세로 줄마다 벽이 어느정도 이어져 있는지 파악하면 되는 문제입니다. 정답률이 굉장히 높기 때문에 도전했습니다. 저번에는 정답률이 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 |