c++ 2667번 문제 풀면서 내가 수정해야 할 사항들.
#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; 처럼 쓰지 않도록 주의하도록 하자. 

 

  Comments,     Trackbacks