인프런 커뮤니티 질문&답변

Raerae님의 프로필 이미지
Raerae

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

4-H

4-H 코드 질문

해결된 질문

작성

·

177

0

안녕하세요 선생님! 강의 항상 잘 듣고 있습니다.

다름이 아니라 선생님 답안을 참고하여 코드를 작성하고 제출하였는데 4%에서 틀리게되어 고치고 다시 제출하였더니 맞았지만

어느부분이 왜 틀렸는지 잘 모르겠습니다...

제가 의심가는 부분은 최대 component 숫자를 업데이트하는 부분(ret2)인데 고치기 전 코드와 고치기 후 코드가 저에겐 같아보여서요.

참고로 틀린 코드 내에 ret1과 id의 역할은 거의 같습니다. (맞은 코드에서 하나로 고침)

한번 봐주시고 왜 틀렸는지 알려주시면 감사하겠습니다 (_ _)

틀린 코드 -
http://boj.kr/cb8d5a12b7d049788680dc1601edd57b

맞은 코드 -
http://boj.kr/d5a147432b404ec4b3a73ab3f2dbda25

답변 1

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 ㅎㅎ

일단은..

저 진짜 많이 시도했어요 ㅠㅠ

image

정답은 찾긴 했습니다 ㅎㅎ ..

#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점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

Raerae님의 프로필 이미지
Raerae
질문자

설마했던 부분이었는데 그랬군요... 많은 시도해주셔서 감사합니다 선생님 ㅜㅜ 한번 백준에도 건의해볼게요~

큰돌님의 프로필 이미지
큰돌
지식공유자

푸우.. 넵넵 ㅎㅎ 감사합니다.

Raerae님의 프로필 이미지
Raerae

작성한 질문수

질문하기