1520:Scramble Sort
keyword
ソート 標準入力 区切り文字 C++
概要
文字列と数の混合の配列が与えられる。文字列と数の位置関係はそのままに文字列と数をそれぞれソートする問題。数値が出現した番号を覚えておけばソートするだけ。入力が,で区切られるので区切り文字を使うとちょっと楽だけどsubstrで済ませた。そのせいかコードが冗長になっているので何とかしたい。
bool isDigit(string s){ if(s[0]=='-') return isDigit(s.substr(1)); EACH(s,it)if( '0'> *it || '9' < *it ) return false; return true; } string toLower(string s){ int i; REP(i,SZ(s))if('A'<=s[i] && s[i]<='Z') s[i] = s[i] - 'A' + 'a'; return s; } int main(){ vector<bool> isDig; vector<int> ns; vector< pair<string, string> > ss; string s; int nc, sc, i; while(1){ ns.clear(); ss.clear(); isDig.clear(); nc = 0; sc = 0; while(1){ cin >> s; if(s==".") break; if(isDigit(s.substr(0,SZ(s)-1))){ isDig.PB(true); ns.PB(atoi(s.substr(0,SZ(s)-1).c_str())); } else{ isDig.PB(false); ss.PB(MP(toLower(s.substr(0,SZ(s)-1)), s.substr(0,SZ(s)-1))); } if(*s.rbegin() == '.')break; } if(isDig.empty()) break; sort(ALL(ns)); sort(ALL(ss)); REP(i,SZ(isDig)){ if(isDig[i]) printf("%d",ns[nc++]); else printf("%s",ss[sc++].second.c_str()); if(i==SZ(isDig)-1) printf(".\n"); else printf(", "); } } return 0; }