3. SOLUTION
• 모든 문자열은 AZAZAZAZ…와 같은 구조를 가지고 두 번째 문자와 마지막 문자만 변경한다.
• 두 번째 문자는 b부터 z까지 가능하다.
• 마지막 문자는 a, b, y, z만 가능하다.
4. CODE
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int k;
int solution(string s) {
int sum = 0;
for (int i = 1; i < s.length(); i++) {
sum += abs(s[i]-s[i-1]);
}
return sum;
}
int main() {
cin >> k;
int len = ceil(k / 25.0) + 1;
string s;
for (int i = 0; i < len; i++) {
s += (i % 2 == 0) ? 'a' : 'z';
}
string clist = "abyz";
for (char second = 'b'; second <= 'z'; second++) {
for (char last:clist) {
string tmp = s;
tmp.back() = last;
tmp[1] = second;
if (solution(tmp) == k) {
cout << tmp << endl;
return 0;
}
}
}
}
5. EXPLANATION
• 당연하게도 대부분의 문자열은 azazaz 와 같이 25씩 더해야 한다.
• 다르게 더할 수 있는 부분이 있다면 처음과 끝이다.
• 처음 두 문자와 마지막 두 문자가 바뀔 수 있다.
• 처음 두 문자의 절댓값 차이가 뭐가 나오던 둘 중 하나는 a가 가능하고
사전 순으로 앞선 문자열을 출력해야 하니 맨 앞 문자는 무조건 a이다.
• 두 번째 문자에 의해 마지막 문자가 결정된다. (경우에 따라 불가능할 수 있다)
• 두 번째 문자가 변경되면 전체 sum은 2씩 변경된다. 𝑎𝑎 − 𝑏𝑏 + 𝑏𝑏 − 𝑐𝑐
• 두 번째 문자가 모든 것을 결정하고 마지막 문자는 2씩 변경되는 문제를 해결하기 위해 하나씩 감소하거나 증가하면 된다.
• 마지막 문자는 a, b, y, z만 가능하다.