작성
·
91
0
안녕하세요! 2-I 맞왜틀이 나와서 질문드립니다...
일단 문제의 예제 입력은 다 맞게 나오던데요,
제가 짠 코드의 로직은:
입력받은 문자열을 문자 하나하나 앞에서부터 검사해서, 0~9까지의 숫자이면 string s에다가 저장해놓습니다. 즉 숫자를 저장합니다.
만약 0~9까지의 숫자가 아니면 문자가 등장했다는 뜻이므로 여태까지 s에 저장되었던 숫자열이 저장될 vector<string> nums에 push_back() 합니다.
그런 다음 공간채우기용 0을 제거하는 로직을 거치는데요.
nums의 문자열들을 string num을 통해 가져와서 앞에서부터 하나하나 검사하는데 0을 만나게 되면 공간채우기용 0을 의미하므로(is_zero_prefix == true) 0이 아닐 때까지 다음 문자를 하나하나 검사하다가 0이 아닌 문자를 만나면 공간채우기용0 검사모드를 끝냅니다.(is_zero_prefix==false)
이런 로직들을 거쳐서 원하는 출력을 내보내는데요..
분명 맞게 나오는데 어떤 반례가 있길래 맞왜틀이 나와버리네요 ㅠㅠ
어떤 부분이 잘못된걸까요..?
답변 2
0
안녕하세요 규민님 ㅎㅎ
제가 규민님 코드를 좀 다듬어 봤는데요 ㅎㅎ
이런 코드를 원하신게 아닌가요?
참고부탁드립니다.
#include <bits/stdc++.h>
using namespace std;
int n;
bool comp(const string &a, const string &b) {
if (a.size() == b.size()) {
return a < b;
}
return a.size() < b.size();
}
int main() {
string temp;
vector<string> nums;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> temp;
string s = "";
for (int j = 0; j < temp.length(); j++) {
if (isdigit(temp[j])) {
s += temp[j];
} else {
if (!s.empty()) nums.push_back(s);
s = "";
}
}
if (!s.empty()) nums.push_back(s);
}
// 앞의 0 제거
for (int j = 0; j < nums.size(); j++) {
string &num = nums[j];
num.erase(0, num.find_first_not_of('0')); // 처음 0이 아닌 문자가 나올 때까지 제거
if (num.empty()) num = "0"; // 모든 숫자가 0이면, "0"으로 설정
}
// 오름차순 정렬
sort(nums.begin(), nums.end(), comp);
for (const string &num : nums) {
cout << num << '\n';
}
return 0;
}
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴입니다. 권규민님, 문제 해결을 위해 노력하신 부분에 대해 먼저 감사드립니다. 2-I 문제와 관련하여 맞왜틀(맞는 것 같은데 왜 틀리는지)에 대한 고민이신 것 같습니다. 귀하의 질문과 유사한 상황에서의 문제 해결 방안을 제시한 기존 답변을 찾았습니다.
해당 질문에서는 숫자 처리에 관련된 문제로, 문자열에서 숫자를 추출하고, 0을 제거하는 로직을 구현하는 과정의 문제점을 질문하고 있습니다. 귀하의 질문에 대한 도움이 될 수 있을 것 같은 답변은 다음과 같습니다:
이 질문에서는 문자열을 숫자로 변환하는 과정에서 int 형의 한계를 초과하는 상황으로 인해 문제가 발생했습니다. 문자열을 int로 변환하여 로직을 구축하는 과정에서 문제의 범위를 항상 체크해야 한다는 점을 강조하고 있습니다.
숫자로 표현할 수 있는 범위를 초과하는 경우에는 문자열 기반으로 로직을 구축해야 하며, 입력 받은 숫자 문자열들에서 앞의 ‘0’을 제거하는 부분에서도 주의가 필요합니다.
입력 문자열의 숫자를 처리할 때 int 형보다 큰 범위의 숫자가 포함되어 있을 수 있기 때문에 long long 형을 사용하거나, 더 선호되는 방법으로 숫자를 문자열로 처리하여 범위 제한 없이 다룰 수 있습니다.
문제가 발생한 구체적인 부분에 대해선, atoi
함수를 사용할 때 생기는 범위 제한 문제를 확인하시고, 숫자 문자열 처리 방식을 조정하여 해결하실 수 있습니다.
이러한 사례를 통해, 귀하의 코드에서도 비슷한 문제가 발생하지 않았는지 확인하시고, 필요하다면 int 대신 문자열 처리 방식을 고려해보시기 바랍니다. 반례를 찾거나 로직을 점겍하는데 있어 이 질문과 답변이 참고가 되길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사합니다!!
사실 find_first_not_of() 함수를 쓰지 않고 직접 공간채우기용 0을 제거하는 로직을 짜본 건데...
어떤 반례가 테스트케이스에 있는지는 몰라도 통과가 안되더라구요..
플래그 변수 is_zero_prefix의 문제인가 싶기도 하고.. 아직까지 제 로직이 어떤 반례를 놓치는지는 의문입니다ㅠㅠ
할튼 답변 감사합니다!! 더 열심히 할게요
P.S.) 저 comp 함수 부분을 for문으로 사전 순으로 비교하지 않고 그냥 a < b 로 하면 되네요!!