inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

2-E와 분할정복(Divide & Conquer)

2-E 분할정복 반례를 찾지 못하겠습니다.

해결된 질문

206

JeongJu Lee

작성한 질문수 5

0

안녕하세요 큰돌님

2-E 문제에서 반례를 찾지 못해서 질문드립니다.

다음과 같이 주어진 배열을 재귀적으로 나누어서

배열 크기가 1일때부터 string으로 다시 합치는 코드입니다.

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

string a[64][64];
int n, ny, nx;
string ret, temp;
int dy[] = {0, 0, 1, 1};
int dx[] = {0, 1, 0, 1};

string four(int num, int y, int x){  
    if(num == 1){
        return a[y][x];
    }
    else{
        string s = "";
        for(int i = 0; i < 4; i++){
            ny = y + dy[i] * (num / 2);
            nx = x + dx[i] * (num / 2);
            s += four(num / 2, ny, nx);
        }
        if(s == "0000") return "0";
        else if(s == "1111") return "1";
        else return "(" + s + ")";
    }
}

int main(){

    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> temp;
        for(int j = 0; j < n; j++){
            a[i][j] = temp[j];
        }
    }
    if(n == 1) {
        ret = "(" + a[0][0] + ")";
        cout << ret << '\n';
    }
    else{
        ret = four(n, 0, 0);
        if(ret == "0" || ret == "1") ret = "(" + ret + ")";
        cout << ret << '\n';
    }
    return 0;
}

c++ 코딩-테스트

답변 2

2

큰돌

안녕하세요 ㅎㅎ

잘 짜셨네요. ㅎㅎ

제 생각에는 굳이 n == 1일 때 나눈부분이 잘 못된 것 같습니다. 저렇게 안나누어도 바로 되는 훌륭한 코드입니다.

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

string a[64][64];
int n, ny, nx;
string ret, temp;
int dy[] = {0, 0, 1, 1};
int dx[] = {0, 1, 0, 1};

string four(int num, int y, int x){  
    if(num == 1){
        return a[y][x];
    }
    else{
        string s = "";
        for(int i = 0; i < 4; i++){
            ny = y + dy[i] * (num / 2);
            nx = x + dx[i] * (num / 2);
            s += four(num / 2, ny, nx);
        }
        if(s == "0000") return "0";
        else if(s == "1111") return "1";
        else return "(" + s + ")";
    }
}

int main(){
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> temp;
        for(int j = 0; j < n; j++){
            a[i][j] = temp[j];
        }
    }
    
    ret = four(n, 0, 0);
    cout << ret << '\n';
    
    return 0;
}

이렇게 해보시겠어요?

 


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

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

감사합니다.

강사 큰돌 올림.



0

JeongJu Lee

하.. 문제 제대로 안읽었네요..ㅜ

감사합니다 큰돌님!

0

인프런 AI 인턴

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

JeongJuLee님 코드에서 분할정복 부분의 로직은 올바르게 구현된 것으로 보입니다.하지만, "0000"이나 "1111"일 때만 압축을 진행하는 그 조건이 문제가 될 수 있습니다. 유의하셔야 할 것은 모든 0들 또는 모든 1들로만 이루어진 더 큰 부분 배열에 대해서도 압축이 이루어져야 한다는 점입니다. 기존 코드는 2x2 부분 배열에 대해 압축하는 로직으로 보이는데, 이는 n이 더 클 때 정상적으로 압축되지 않을 수 있습니다.

제시된 코드에서 주어진 배열의 모든 값을 확인하여 압축이 가능한지를 재귀적으로 확인하고 있고, 각 구역의 결과값을 재귀 호출로 합쳐 조건에 맞게 압축하거나 괄호를 추가하는 구현을 하셨습니다. 반환되는 문자열을 검사할 때는 4개의 ‘0’ 혹은 ‘1’이 연속된 문자열인지를 체크하지만, 더 큰 크기의 전체 구역이 같은 값으로 이루어져 있을 때 이를 문자 하나인 ‘0’ 또는 ‘1’로 압축해야 할 수 있습니다. 이를 감안하여 추가적인 로직 검토가 필요합니다.

또한 기저 사례에서 n == 1 인 경우, 압축 결과를 괄호로 묶어 출력하는 것은 문제의 요구사항에 따라 다를 수 있기 때문에, 문제의 상세한 조건을 다시 한번 확인하시기 바랍니다.

반례를 찾는 데 어려움이 계속된다면, 더 다양한 입력 값에 대해서 결과를 출력해보고 예상과 다른 부분이 있다면 그 부분을 중점적으로 검토해보시는 것이 좋습니다. 예를 들어 n이 2보다 클 때 더 큰 배열에 대해서도 올바르게 압축하는지 테스트해볼 필요가 있습니다.

잠재적인 문제가 수정되고 나면, 다시 예제 입력 및 추가적인 다양한 입력을 통해 코드를 테스트해 보세요. 만약 이후에도 문제가 해결되지 않는다면, 해당 강의의 커뮤니티 질문&답변 게시판에 직접 질문을 올리시면 강사님이 확인 후 답변을 드릴 수 있습니다.

도움이 필요하시면 언제든지 문의하세요. 추가적인 질문이 있으시면 도와드릴 준비가 되어 있습니다. 화이팅입니다!

코딩살구클럽 입장이 안됩니다

0

3

1

4-F 경우의 수 질문입니다.

0

24

2

코딩살구클럽 가입이 안됩니다.

0

50

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

40

1

교안 158페이지 문의드립니다

0

37

2

코딩살구클럽 관련 건의사항

0

94

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

39

1

진행 방법 질문드립니다!

0

72

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

61

2

2주차 개념#12 트리 순회

0

32

2

백준사이트가 종료된다고 합니다.

0

301

2

백준 서비스 종료

9

913

1

sk 하이닉스 코테 대비

0

377

2

3-G 최댓값 질문

0

52

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

63

2

3-N 질문 있습니다.

0

68

2

학습방법

0

104

2

4-H 질문 있습니다 (코드 리뷰)

0

67

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

178

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

70

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

65

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

52

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

69

2