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

윤희중님의 프로필 이미지
윤희중

작성한 질문수

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

2-J

값은 정상적으로 나오는데 어디가틀린지모르겠습니다.

작성

·

155

0

안녕하세요 큰돌님. 언제나 늘감사하게 수업듣고있습니다.

vscode에서는 이코드로돌리면 정상적으로 나오는데 어디가틀린지 모르겠네요 한번만 봐주실수있을까요? 감사합니다.

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

string a[104][104];
int h,w,cnt,ret[104][104];
string s;
bool flag;

int main() {
    cin >> h >> w;

    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++){
            cin >> s;
            a[i][j] = s; 
        }
    }

    for(int i=0; i<h; i++){
        flag = 0;
        for(int j=0; j<w; j++){
            if(a[i][j] == "c"){
                cnt = 0;
                flag = 1;
                ret[i][j] = cnt;

            }
            if(flag && a[i][j] == "."){
                cnt++;
                ret[i][j] = cnt;

            } else if(!flag) {
                flag = 0;
                ret[i][j] = -1;

            }
        }
    };

    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++){
            cout << ret[i][j] << " ";
        }
        cout << "\n";
    }


return 0;
}

답변 2

0

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

안녕하세요 희중님 ㅎㅎ

cin은 개행문자 직전 까지 받습니다.

즉,

c..c

이거 자체가 하나의 문자열로 이루어져있기 때문에 입력을 그렇게 해서는 안됩니다... ㅎㅎ

(즉, cin >> s 를 한번 하고 그걸 나눠서 해야 함.)

제가 좀 수정해봤는데요.

(좀 다듬어봤습니다.)

 

이렇게 해보시겠어요?

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

string a[104][104];
int h,w,cnt,ret[104][104];
string s; 

int main() {
    cin >> h >> w;

    for(int i=0; i<h; i++){
        cin >> s; 
        for(int j=0; j<w; j++){ 
            a[i][j] = s[j]; 
        }
    }

    for(int i=0; i<h; i++){ 
        cnt = -1;
        for(int j=0; j<w; j++){
            if(a[i][j] == "c"){
                cnt = 0; 
            }else if(cnt != -1){
                cnt++; 
            }
            ret[i][j] = cnt; 
        }
    }

    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++){
            cout << ret[i][j] << " ";
        }
        cout << "\n";
    }
 
    return 0;
}


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

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

감사합니다.

강사 큰돌 올림.


윤희중님의 프로필 이미지
윤희중
질문자

감사합니다 큰돌님

오늘도 즐거운 하루보내세요

0

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

윤희중님, 문의해주셔서 감사합니다.

해당 코드를 보았을 때, 현재 flag 변수는 각 행을 순회하며 ‘c’ 문자를 만났는지를 확인하는 역할로 사용되고 있는 것으로 보입니다. 그런데 flagfalse로 설정하는 조건문에 문제가 있는 것 같네요.

    for(int i=0; i<h; i++){
        flag = 0;
        for(int j=0; j<w; j++){
            if(a[i][j] == "c"){
                cnt = 0;
                flag = 1;
                ret[i][j] = cnt;
            }
            if(flag && a[i][j] == "."){
                cnt++;
                ret[i][j] = cnt;
            } else if(!flag) {
                flag = 0; // 이 부분은 불필요합니다.
                ret[i][j] = -1;
            }
        }
    };

flag = 0;은 ‘c’ 문자를 아직 만나지 않았을 때 각 셀에 -1을 할당하기 위해 설정하는 것으로 보입니다. 그런데 for 루프가 새 행의 시작 부분에서 flag = 0;으로 이미 초기화되고 있으므로, else if(!flag) 안에서 flag = 0;을 다시 설정할 필요는 없습니다. ‘c’ 문자를 만났을 때만 flag = 1;로 설정하고, 나머지 경우는 flag를 수정하지 않아도 됩니다.

더불어, 영어를 찍은 다음 ‘.’ 문자를 만났을 때의 로직에서 flagfalse로 설정하는 부분이 없습니다. 그로 인해 이후 구름이 없는 경우에 대한 처리가 필요해 보입니다.

또한, else if(flag) 구문이 없어서 ‘c’ 문자를 만난 후에 다음 ‘c’ 문자를 만나기 전까지는 cnt가 계속 증가하게 될 것입니다. 이것이 의도된 로직이 아니라면 수정이 필요할 것 같습니다.

질문내용을 바탕으로 코드에 대한 문제점을 짚어드린 것이며, 실제 문제의 정확한 상황을 더 잘 아시는 강의자분에게 질문하시면 더 상세하고 정확한 답변을 받으실 수 있을 것입니다.

강의 관련 질문은 해당 강의의 커뮤니티 Q&A 게시판에 올리시면 강사님이 확인하시고 답변해 주실 것입니다.

도움이 되셨길 바랍니다. 감사합니다.

윤희중님의 프로필 이미지
윤희중

작성한 질문수

질문하기