inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

2-E 질문있습니다! 무엇이 문제일까요??

183

P Sireal

작성한 질문수 1

0

 

큰돌님 안녕하세요.
강의 정말 재밌게 잘 시청하며 공부하고있습니다.👍

2-E 문제를 위의 코드로 시도를 하고 있습니다.
계속 처음부터 틀렸다는 답이 나와서 질문드립니다.

 

문제의 반례로 정답을 확인했음에도 틀렸다고나오고,
문제의 질문게시판의 여러 반례를 확인했는데도 틀렸다고 나옵니다.

출력 String사이에 다른 char가 있을까봐 저의 출력용 전역변수인 _ret 의 내부 값들을 하나하나 확인했는데도 실제 정답과 동일함을 확인했습니다.

 

무엇이 문제일까요.. ㅠㅠ
그리고 제가 무언가 잘못집고있다면
강의교안에서 어떤것을 봐야할까요..?

 

 

(정답과 강의를 보기전에 문제를 풀어보느라 코드가 매우 지저분한점 양해부탁드립니다...)

문제 URL: 1992번: 쿼드트리 (acmicpc.net)

코드 URL: http://boj.kr/b720b19e7fde44a093809570d702a3c9

참고한 TestCase

- 문제에서 제공하는 기본 TestCase

- 글 읽기 - 반례공유 (acmicpc.net)

- 글 읽기 - << 테스트 케이스 공유 >> (acmicpc.net)

- 글 읽기 - [1992번] 틀린 부분, 반례 부탁드립니다ㅠㅠ (acmicpc.net)

 

 

 

c++ 코딩-테스트

답변 1

1

큰돌

안녕하세요 ㅎㅎ

수강생님 코드의 핵심 중 하나는 동일하면 -> 괄호제거 -> 하나의 값으로 압축 이부분이 차별점인데 제 생각에 이 로직에 분명 반례가 있는 것 같은데 그부분은 찾지 못했습니다.

다만, 최대한 수강생님 코드 기반으로 다듬어봤습니다.

이렇게 하시는것은 어떨까요?

그리고 전체적으로 함수명이 너무나 깁니다 ㅠㅠ 이부분은 개선해야 합니다.

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

int _N = 0;
vector<char> _ret;

void div_arr_and_push_value(pair<int,int> pre_l_up, pair<int,int> pre_r_dwn, int pre_arr_len, vector<vector<char>>& arr)
{
    if(pre_arr_len <= 1)
    {
        _ret.push_back(arr[pre_l_up.first][pre_l_up.second]);
        return;
    }

    bool is_same = true;
    char first_value = arr[pre_l_up.first][pre_l_up.second];
    for(int i = pre_l_up.first; i <= pre_r_dwn.first; ++i)
    {
        for(int j = pre_l_up.second; j <= pre_r_dwn.second; ++j)
        {
            if(arr[i][j] != first_value)
            {
                is_same = false;
                break;
            }
        }
        if(!is_same) break;
    }

    if(is_same)
    {
        _ret.push_back(first_value);
        return;
    }

    _ret.push_back('(');
    int curr_arr_len = pre_arr_len / 2;

    // 왼위
    div_arr_and_push_value(pre_l_up, 
                           {pre_l_up.first + curr_arr_len - 1, pre_l_up.second + curr_arr_len - 1}, 
                           curr_arr_len, arr);
    // 오위
    div_arr_and_push_value({pre_l_up.first, pre_l_up.second + curr_arr_len}, 
                           {pre_l_up.first + curr_arr_len - 1, pre_r_dwn.second}, 
                           curr_arr_len, arr);
    // 왼아래
    div_arr_and_push_value({pre_l_up.first + curr_arr_len, pre_l_up.second}, 
                           {pre_r_dwn.first, pre_l_up.second + curr_arr_len - 1}, 
                           curr_arr_len, arr);
    // 오른아래
    div_arr_and_push_value({pre_l_up.first + curr_arr_len, pre_l_up.second + curr_arr_len}, 
                           pre_r_dwn, 
                           curr_arr_len, arr);

    _ret.push_back(')');
}

int main()
{
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> _N;
    vector<vector<char>> arr(_N, vector<char>(_N));
    for(int usr_idx = 0; usr_idx < _N; usr_idx++)
    {
        string usr_str;
        cin >> usr_str;
        for(int j = 0; j < _N; j++)
        {
            arr[usr_idx][j] = usr_str[j];
        }
    }

    int arr_size = arr.size();
    div_arr_and_push_value({0, 0}, {arr_size - 1, arr_size - 1}, arr_size, arr);
    
    for(auto ch: _ret)
        cout << ch;

    return 0;
}



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

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

감사합니다.

강사 큰돌 올림. 


 

1

P Sireal

안녕하세요 큰돌님.
답변 잘 확인했습니다!!

 

위의 제 코드에서 강사님께서 수정해주신 포인트는 크게 이것으로 보입니다.

분할정복을 바로 시작하는 것이 아닌,
분할정복이 필요한지 체크를 먼저 진행한다.

강의영상의 코드에서도 이 포인트가 가장 중요한 포인트로 보였으며, 코드를 이해했을 때 이마한번 탁 치고 감탄했었습니다.

그리고 함수명이 길다는 부분은 바로 고쳐나가겠습니다.

 

강사님의 신속하고 따뜻한 답변 감사드리며 좋은 하루 되세요.👍👍

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

0

10

0

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

0

26

2

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

0

60

1

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

0

28

1

진행 방법 질문드립니다!

0

58

2

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

0

60

2

2주차 개념#12 트리 순회

0

29

2

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

0

289

2

백준 서비스 종료

9

895

1

sk 하이닉스 코테 대비

0

370

2

3-G 최댓값 질문

0

51

1

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

0

83

2

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

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

102

2

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

0

66

2

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

0

173

2

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

0

69

2

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

0

64

2

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

0

51

2

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

0

68

2

함수별 시간복잡도

0

74

2

3-h 질문입니다.

0

49

1

안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.

0

53

2