#include <bits/stdc++.h>
using namespace std;
string s;
int n;
vector<string> v;
bool isNum(char c){
return (c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' ||
c == '7' || c == '8' || c == '9');
}
bool cmp(string a, string b){
int c = stoi(a);
int d = stoi(b);
return c < d;
}
int main(){
string ret;
int idx = 0;
cin >> n;
for(int i = 0; i < n; i++){
cin >> s;
ret = "";
for(int j = 0; j < s.size(); j++){
char c = s[j];
if(c == '0' && s[j+1] != '0' && !isNum(s[j+1]) && (j+1) <= s.size()){
ret += c;
v.push_back(ret), ret = "";
}
if(isNum(c) && !isNum(s[j+1]) && (j+1) <= s.size() ) ret += c, v.push_back(ret), ret = "";
if(isNum(c) && isNum(s[j+1]) && (j+1) <= s.size() ) ret += c;
}
}
sort(v.begin(), v.end(), cmp);
for(auto it: v){
cout << it << "\n";
}
return 0;
}
주어진 tc만 통과한다고 무조건 맞지 않는다. 범위, 오버플로우 등 생각해야할 것이 많다고 느꼈다.
#include <bits/stdc++.h>
using namespace std;
int n;
vector<string> v;
string s, ret;
void check(){
while(1){
if(ret.size() && ret.front() == '0') ret.erase(ret.begin());
else break;
}
if(ret.size() == 0) ret = '0';
v.push_back(ret);
ret = "";
}
bool cmp(string a, string b){
if(a.size() == b.size()) return a < b;
return a.size() < b.size();
}
int main(){
cin >> n;
for(int i = 0; i < n; i++){
cin >> s;
ret = "";
for(int j = 0; j < s.size(); j++){
if(s[j] < 65) ret += s[j];
else if(ret.size()) check();
}
if(ret.size()) check();
}
sort(v.begin(), v.end(), cmp);
for(auto i : v) cout << i << "\n";
return 0;
}
조금 집중해서 코딩하면 구현할 수 있을만한 내용이라 생각했다.
저번에 풀었던 비밀번호 발음하기 - 4659번와 비슷한 유형이었는데 구현은 설계가 정말 중요한것 같다.
첫 번째 접근법은 숫자 판별이 핵심이라 생각하여 숫자 판별 함수를 만들었고
두 번째 접근법은 0을 제거하는 것이 핵심이라 생각하여 0을 제거하는 함수를 만들었다.
구현 난이도 자체는 크게 다르지 않았지만 결과는 달랐다.
문제를 해결하는데 핵심적인 key가 무엇인지를 잘 파악해야함을 배웠다.