fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <regex>
  4.  
  5. std::string rr(const std::string& s) {
  6. if (s.empty()) return s;
  7.  
  8. std::string c;
  9. int cnt = 1;
  10.  
  11. // 압축 문자열 생성
  12. for (size_t i = 1; i < s.length(); ++i) {
  13. if (s[i] == s[i - 1]) {
  14. cnt++;
  15. } else {
  16. c += s[i - 1] + std::to_string(cnt); // 문자와 그에 해당하는 개수 추가
  17. cnt = 1;
  18. }
  19. }
  20. c += s.back() + std::to_string(cnt); // 마지막 문자와 개수 추가
  21.  
  22. // 압축된 문자열이 원본보다 길면 원본 반환
  23. if (c.length() < s.length()) return c;
  24.  
  25. // '1'을 제거
  26. std::regex pattern("([A-Za-z])1(?!\\d)"); // 문자 뒤의 '1' 제거
  27. std::string fc = std::regex_replace(c, pattern, "$1");
  28.  
  29. // '1'을 제거한 후 압축된 문자열이 원본보다 짧으면 그 문자열을 반환
  30. if (fc.length() < s.length()) return fc;
  31.  
  32. return s; // 원본이 가장 짧으면 원본 반환
  33. }
  34.  
  35. int main() {
  36. std::string input;
  37. std::cin >> input;
  38. std::cout << rr(input) << std::endl;
  39. return 0;
  40. }
  41.  
Success #stdin #stdout 0s 5276KB
stdin
`KKKKKKKKKKKKKKKKKKKKKQWERTYUIOPASDFGKKZXC
stdout
`1K21QWERTYUIOPASDFGK2ZXC