이번에는 map이라는 2차원 배열과 벡터 2차원 배열을 사용했다. 우선 입력 자체는 map에 우선 입력 후 벡터 2차원 배열(그래프 연결)에 edge들을 연결하는 식으로 구현했다. 지금 생각해보니 map이 없어도 입력받은 값들의 이전 값들만 이용하여 연결 할 수 있을 것 같다. (왼쪽 배열 값과 위쪽 배열 값, 대각선 배열 값)
생각한 팁
그래프를 연결할 때, 다른 edge와 연결이 되더라도 자신이 1이라면 자기 자신과의 사이클을 형성하는 것이 편하다. 다른 edge와 연결이 안 된 경우와 자기 자신의 사이클을 형성하는 것을 분리해 버리면 예외처리가 너무 복잡해지는 것 같았다.
오래걸렸던 이유
문제 자체는 해결 방법을 빠르게 생각했다. 실제로 크게 어렵지 않은 문제이기도 하고 대부분 현한 그대로가 정답일 수 있다고 생각한다. 우선 결론부터 짓으면 c++에 아직 익숙치 않아 속도가 나지 않는다고 생각한다. 이것은 구현력이 부족하다고 할 수 있겠다. 디버깅을 하면서 다음과 같은 문제가 있었다.
벡터를 초기화할 때 이전 테스트 케이스의 벡터 크기가 남아있음.(초기화 문제)
가로와 세로 크기를 입력 받은 뒤 둘을 서로 바꿔 생각함 속도 향상을 위해서 한번에 꼼꼼하게 코딩하도록 하고 익숙치 않은 함수들에 익숙해 지려고 노력해야 겠다.
voidedgeConnect(int width,int height) { int idx = 0; int isLeftLand = 0; int isCurLand = 0; int isUpLand = 0; int isLeftDiagonalLand = 0; int isRightDiagonalLand = 0;
if(width == 1 && height == 1) { cout << map[0][0] << "\n"; continue; } edgeConnect(width,height); for(int i = 0;i<maxIdx;i++) { if(!visit[i]) { int result = 0; //cout << i << "번째 DFS 시작\n"; result = DFS(i); if(result) { //cout << i << "번째 DFS의 탐색 성공\n"; } landCount += result;
} } cout << landCount << "\n"; }
}
intmain() { solve(); }
익숙해져야 할 함수
2차원 벡터 초기화
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
//아래의 코드로 구현해서 테스트 케이스마다 벡터가 제대로 초기화 되지 않음 //MAX x MAX의 2차원 벡터 생성 vector<vector<int>> graph(MAX, vector<int>(MAX)); //앞의 두 인자는 어디부터 어디까지, 세번째 인자는 넣을 값 //begin부터 end까지 각 row에 MAX만큼의 각 vector<int>를 0으로 초기화한다