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

김우영님의 프로필 이미지
김우영

작성한 질문수

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

2-I

코드에 어떤 오류가 있는걸까요..?

해결된 질문

작성

·

77

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

image.png

위 사진처럼 000과 001 로 이루어진 문자열을 atoi를 이용하여 변환 후 사용하였을 때 다음과 같이 출력되는 것을 보고 이를 사용해서 문제를 풀려고 시도하였고 코드는 다음과 같습니다.

#include <bits/stdc++.h>
using namespace std;
//2870 - 수학 숙제
int n;
string s;
vector<int> v;
int main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin>>n;
    for(int i=0;i<n;i++){
        string tmp="";
        cin>>s;
        for(char c:s){
            if(c>='a' && c<='z'){
                if(tmp!=""){
                    int num = atoi(tmp.c_str());
                    v.push_back(num);
                    tmp="";
                }
                continue;
            }
            tmp+=c;
        }
        if( tmp!=""){
            int num = atoi(tmp.c_str());
            v.push_back(num);
            tmp="";
        }
    }
    sort(v.begin(), v.end());
    for(int i:v) cout<<i<<'\n';
    return 0;
}

제가 사용한 로직은 문자열을 입력 받고 알파벳이 나오기 전까지 숫자를 tmp라는 string 변수 저장 후 알파벳이 나오면 해당 tmp를 atoi를 사용하여 integer로 변환하고 vector에 push하도록 하였습니다.

따라서 해당 vector에는 integer 값으로 이루어져있기 때문에 기존의 sort 함수를 그대로 사용해도 된다고 생각했고 이를 토대로 코드를 작성하고 출력까지 진행하였습니다.

테스트 케이스들에 대해서는 전부 알맞게 출력되었고 제출을 하였는데 틀렸다고 출력됩니다. 어떤 부분에서 혹은 어떤 반례가 존재하여 해당 코드가 잘못되었는지 알 수 있을까요?

좋은 강의 항상 감사드립니다.

답변 3

0

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

안녕하세요 ㅎㅎ

            if(c>='a' && c<='z'){
                if(tmp!=""){
                    int num = atoi(tmp.c_str());
                    v.push_back(num);
                    tmp="";
                }
                continue;
            }
            tmp+=c;

이부분에서 틀리는 것 같습니다.

 

이 문제의 범위를 보시면요. 다음과 같이 100글자를 커버해야합니다. 참고로 int는 10글자를 커버가능합니다. (21억이므로.. ex - 100 : 3글자) 연속해서 큰 숫자가 나온 경우 10글자로 해결하지 못함 -> 틀리게 됩니다.

image.png

 

 

int가 아니라 string을 기반으로 다시 해보시겠어요?



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

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

감사합니다.

강사 큰돌 올림.


0

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

김우영님의 질문을 검토하고 비슷한 상황에서 발생했던 문제와 그에 대한 해결 방안을 제공해 드린 사례를 찾았습니다.

문제 요약

  • 입력된 문자열에서 문자와 숫자를 분리하여 숫자만을 추출한 후, 이들을 정렬하여 출력하고자 하는 문제입니다.
  • atoi 함수를 사용하여 문자열에 포함된 숫자를 추출하고 있습니다.
  • 모든 테스트 케이스에서 올바른 출력을 얻었음에도 불구하고, 제출했을 때는 “틀렸습니다”라는 결과를 받았습니다.

유사한 상황과 해결 방안

이전에 다른 수강생이 비슷한 상황에서 겪었던 문제와 해결책을 공유했습니다. 해당 수강생도 atoi 함수를 사용하여 숫자값을 얻고 있었으나, 제출 시 “틀렸습니다” 결과를 받았습니다. 이는 입력으로 주어지는 숫자의 크기가 int 범위를 초과할 수 있음을 고려하지 않은 것이 원인이었습니다.

  • 2-i 2870번 - 수학숙제에서는 atoi 함수의 사용이 int 범위 초과 문제로 인해 오류를 발생시킨 예시가 있습니다. 문제 해결을 위해 long long 형태의 자료형을 사용하거나, 숫자를 string 형태로 다루는 등의 방식을 고려해야 합니다.

귀하의 경우에 대한 제안

특히, 김우영님의 코드에서도 비슷한 문제가 발생할 가능성이 있습니다. 크기가 큰 숫자(예를 들어, 100자까지 가능한 입력)에 대해 atoi를 사용할 때, int 범위를 넘어서는 값을 처리하지 못할 수 있습니다. 따라서, 다음 방안을 고려해볼 수 있습니다.

  1. 숫자를 int가 아닌 long long으로 처리합니다.
  2. 아예 숫자를 string으로 처리하여 sort 함수를 사용할 때 특정 조건(compare 함수 등)을 이용해 정렬합니다.

예제 코드나 구체적인 해결 방안에 대해 더 깊이 이해하려면, 상기 링크를 참고하시길 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김우영님의 프로필 이미지
김우영

작성한 질문수

질문하기