• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

2 - P 질문

24.04.06 16:14 작성 조회수 62

0

http://boj.kr/ce16c6cbdf114d2dab3f3a8f44c9c285
안녕하세요 강사님

2-P 문제를 강사님의 풀이와는 달리 for 중첩문이랑 처음 입력한 mp배열을 복사해서 풀이할 temp배열을 만들어서 풀어봤는데 몇몇 예제에서 오답이 나와서 질문 드려요ㅠㅡ

답변 2

·

답변을 작성해보세요.

0

안녕하세요 ㅎㅎ

    for(int i = 0; i < n * m; i++){
        if(mp[i / n][i % n] == 0) mp[i / n][i % n] = 1;

이거 두번째 차원의 i % n -> i % m 이 되어야 하지 않을까요?

 

제가 좀 다듬어봤습니다. ㅎㅎ 참고해주세요~

#include<bits/stdc++.h>
using namespace std;

int n, m, ret = 0;
int dy[] = {-1, 0, 1, 0};
int dx[] = {0, 1, 0, -1};
int mp[8][8];
int temp[8][8];
bool visited[8][8];

void dfs_v(int y, int x) {
    visited[y][x] = true;
    temp[y][x] = 2;  
    for (int i = 0; i < 4; i++) {
        int ny = y + dy[i];
        int nx = x + dx[i];
        if (ny < 0 || nx < 0 || ny >= n || nx >= m) continue;
        if (!visited[ny][nx] && temp[ny][nx] == 0) {
            dfs_v(ny, nx);
        }
    }
}

void fillVirus() {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (temp[i][j] == 2 && !visited[i][j]) {
                dfs_v(i, j);
            }
        }
    }
}

void check() {
    int safeArea = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (temp[i][j] == 0) safeArea++;
        }
    }
    ret = max(ret, safeArea);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) cin >> mp[i][j];
    }

    for (int i = 0; i < n * m; i++) {
        int x1 = i / m, y1 = i % m;
        if (mp[x1][y1] != 0) continue;
        for (int j = i + 1; j < n * m; j++) {
            int x2 = j / m, y2 = j % m;
            if (mp[x2][y2] != 0) continue;
            for (int k = j + 1; k < n * m; k++) {
                int x3 = k / m, y3 = k % m;
                if (mp[x3][y3] != 0) continue;
                 
                mp[x1][y1] = mp[x2][y2] = mp[x3][y3] = 1;
                 
                memcpy(temp, mp, sizeof(mp));
                memset(visited, false, sizeof(visited));
                fillVirus();
                check();
                 
                mp[x1][y1] = mp[x2][y2] = mp[x3][y3] = 0;
            }
        }
    }
    cout << ret << '\n';
    return 0;
}


또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.08

안녕하세요, 인프런 AI 인턴입니다.

강의 관련 질문은 강의를 결제하신 후, 해당 강의의 ‘수강 후 문의 게시판’을 이용해 주시는 것이 가장 빠른 피드백을 받을 수 있는 방법입니다. 제공된 정보에 따르면, 수강 전인 경우에는 [수강 전 문의 게시판]을 통해 질문하는 방법이 있지만, 이미 수강 중이시라면 강의 페이지 내에서 직접 강사님께 질문을 남기시는 것이 좋습니다.

문제의 특정 예제에서 오답이 나오는 경우, 보통 반례를 찾거나 알고리즘의 로직을 다시 한 번 검토해보아야 합니다. 중첩된 for문이나 배열을 복사하는 로직에서 놓친 부분이 없는지, 예외 사항을 처리하지 않았는지 확인해 보세요.

직접적인 코드 리뷰가 필요하신 경우라면 해당 강의의 문의하기 섹션 또는 개발자 커뮤니티, 스택 오버플로우와 같은 외부 플랫폼을 이용해 좀 더 구체적인 피드백을 얻는 것도 방법입니다.

다만, 구체적인 코드 없이는 정확한 오류 원인 파악이 어려울 수 있으니, 가능하다면 코드 일부나 오류가 발생하는 특정 부분을 함께 질문하시면 좋습니다.

도움이 필요하시다면 언제든지 문의해 주세요. 감사합니다!