#include <bits/stdc++.h>
using namespace std;
int n;
string board[30];
bool vis[30][30];
int cnt;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
vector<int> ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++)
cin >> board[i];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == '0' || vis[i][j] == true) continue;
queue<pair<int, int>> q;
q.push({ i,j });
vis[i][j] = true;
cnt++;
int area = 1;
while (!q.empty()) {
int x, y;
tie(x, y) = q.front(); q.pop();
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
if (board[nx][ny] == '0' || vis[nx][ny] == true) continue;
q.push({ nx,ny });
vis[nx][ny] = true;
area++;
}
}
ans.push_back(area);
}
}
cout << cnt << '\n';
sort(ans.begin(), ans.end());
for (auto c : ans) {
cout << c << '\n';
}
}
일단 위에 코드는 내가 답안 제출을 하고 난 뒤에도 지속적으로 다시 써가면서 연습한 코드이다.
처음에 시험을 볼때 분명 논리는 다 제대로 된것 같았는데 자꾸 정상적으로 동작을 하지 않아서 시간을 많이 허비하였는데, 보다보니까
#define X first;
#define Y second; 라고 써놓았다는걸 발견하였다. 이 부분에서 ; 을 제거하니까 제대로 동작하였다.
결과적으로 이제부터 나는 #define X first, #define Y second를 사용하지 않기로 하였다.
그냥 int x, y를 새로 잡은뒤에, tie(x,y)로 만들어서 pair화 시키고, 이걸로 각각의 x,y에 분배시켜주는게 훨씬 나에게 맞는 코드구현이라는 생각이 든다.
그래서 앞으로는 #define X first 형태를 사용하지 말자. 과거에도 분명 ;을 #define 뒤에 붙여서 제대로 찾지 못한적이 많았는데, 이번에도 너무 심하게 오래걸렸다.
long long 사용할때도 typedef long long ll형태로 사용하는걸로 결정하였고 그렇게 익숙해지도록 하고, 그리고 #define도 사용하지 말고 그냥 바로 int x, y; tie(x,y)=q.front(); 형태로 작성하도록 하자.
그리고 vis[i][j]; 형태로 자꾸써놓는것 같은데, 확실하게 true, false를 작성하도록 하자. 그리고 나는 0, 1형태로 쓰면 뭔가 눈에 제대로 확 안들어오는것 같은데, 그냥 vis[i][j]=true; 형태로 작성하도록 하자. 그리고 대입할때 vis[i][j]==true; 처럼 쓰지 않도록 주의하도록 하자.
'알고리즘 > BOJ' 카테고리의 다른 글
c++ min(), max()에 3개 이상의 인자를 넘길때의 방법. (0) | 2023.04.29 |
---|---|
c++ 128mb가 주어졌을때 만들수 있는 int 타입 변수의 갯수. (0) | 2023.04.28 |
c++. 무조건 지역변수로 선언할때는 초기화를 해주어야 한다. 초기화를 했을때와 안했을때의 차이점. (0) | 2023.04.26 |
c++ fill()에 대해서 궁금한 부분 조사. (0) | 2023.04.26 |
비내림차순과 오름차순에 관하여. 결론적으로 둘은 다르다. (0) | 2023.04.24 |