해결된 질문
작성
·
177
0
안녕하세요 선생님! 강의 항상 잘 듣고 있습니다.
다름이 아니라 선생님 답안을 참고하여 코드를 작성하고 제출하였는데 4%에서 틀리게되어 고치고 다시 제출하였더니 맞았지만
어느부분이 왜 틀렸는지 잘 모르겠습니다...
제가 의심가는 부분은 최대 component 숫자를 업데이트하는 부분(ret2)인데 고치기 전 코드와 고치기 후 코드가 저에겐 같아보여서요.
참고로 틀린 코드 내에 ret1과 id의 역할은 거의 같습니다. (맞은 코드에서 하나로 고침)
한번 봐주시고 왜 틀렸는지 알려주시면 감사하겠습니다 (_ _)
틀린 코드 -
http://boj.kr/cb8d5a12b7d049788680dc1601edd57b
맞은 코드 -
http://boj.kr/d5a147432b404ec4b3a73ab3f2dbda25
답변 1
1
안녕하세요 ㅎㅎ
일단은..
저 진짜 많이 시도했어요 ㅠㅠ
정답은 찾긴 했습니다 ㅎㅎ ..
#include <bits/stdc++.h>
using namespace std;
int N, M, mp[51][51], ret1, ret2, ret3, tempRet, visited[51][51], cntSum[51];
pair<int,int> d[] = {{0,-1},{-1,0},{0,1},{1,0}};
int id;
int dfs(int y, int x, int id) {
if (visited[y][x]) return 0;
visited[y][x]=id;
int cnt=1;
for(int i=0; i<4; ++i) {
if (!(mp[y][x] & (1<<i))) {
int ny=y+d[i].first;
int nx=x+d[i].second;
cnt += dfs(ny,nx,id);
}
}
return cnt;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> M >> N;
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
cin >> mp[i][j];
}
}
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
if (!visited[i][j]) {
++ret1; ++id;
tempRet = dfs(i, j, id);
cntSum[id]=tempRet;
}
ret2 = max(ret2, tempRet);
}
}
for (int i=0; i<N; ++i) {
for (int j=0; j<M; ++j) {
if (i+1<N) {
int id1=visited[i][j];
int id2=visited[i+1][j];
if (id1!=id2) ret3 = max(ret3, cntSum[id1]+cntSum[id2]);
}
if (j+1<M) {
int id1=visited[i][j];
int id2=visited[i][j+1];
if (id1!=id2) ret3 = max(ret3, cntSum[id1]+cntSum[id2]);
}
}
}
cout << ret1 << '\n';
cout << ret2 << '\n';
cout << ret3 << '\n';
return 0;
}
이렇게 하시면 틀리지 않고 맞게 나옵니다.
id라는 변수명을 써두요. ㅎㅎ
근데 왜 틀렸는지는... 모르겠습니다.
id라는 변수명이 잘못됬냐? -> 아닙니다.
++, ++; -> 이게 잘못됬냐.. 아닙니다. ㅠㅠㅠㅠ
백준 내부의 문제인것인지.. 모르겠습니다 ㅠㅠ
20% 부족한 답변 죄송합니다 ㅠ
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
설마했던 부분이었는데 그랬군요... 많은 시도해주셔서 감사합니다 선생님 ㅜㅜ 한번 백준에도 건의해볼게요~