반응형

문제 링크

 

17828번: 문자열 화폐

첫 번째 줄에 문자열의 길이 N(1 ≤ N ≤ 5,000,000)과, 문자열의 가치를 나타내는 정수 X(1 ≤ X ≤ 500,000,000)가 공백으로 구분되어 주어진다.

www.acmicpc.net

 

풀이 )

  사전 순이기 때문에 앞에 최대한 작은 알파벳이 들어가야되기 때문에 뒤쪽으로 최대한 큰 알파벳을 배치하면 된다.

  즉, 앞쪽에는 가능하면 'A'를 뒤쪽에는 가능하면 'Z'를 배치하면 된다.

 

  먼저 가치를 모두 'A'로 나타내는 가치보다 작은 경우와 모두 'Z'로 나타내는 가치보다 큰 경우는 만족하는 문자열이 없으므로 '!'를 출력한다.

  이후 각 자리에 'A'를 배치하고 뒤에서부터 'Z'를 채워 넣기 위해 처음에 문자열의 길이만큼 빼서 'A'를 분배한다.

  'Z'가 가능한만큼 현재 남은 가치에서 25씩 빼간다. 남은 가치가 25미만인 경우 남은 가치를 마지막에 더해주고 마지막에 'A'를 빈자리에 채워준다.

 

  '+=' 연산 시 의도와 달리 뒤로 문자를 추가해가기 때문에 마지막에 reverse( )를 취한다.

 

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main(void){
    int n, x;
    cin >> n >> x;
    if(x < n || x > n*26){
        cout << "!\n";
        return 0;
    }

    string ans;
    x -= n;
    while(x >= 25){
        ans += 'Z';
        x-=25;
    }
    if(x)
        ans += 'A'+x;

    int len = ans.length();
    for(int i = len; len < n; ++len)
        ans += 'A';
    reverse(ans.begin(), ans.end());
    cout << ans << '\n';
}

 

주의 )

  위와 같이 구현했을 때, 'Z'를 채워 넣은 후 남은 가치를 넣는 경우 조건문을 넣지 않는 경우 "ZZZZ"와 같이 'Z'로만 이루어져 남은 가치가 0이 되면 'A'가 추가되어 "AZZZZ"가 되기 때문에 조건문을 추가해줘야된다.

반응형

+ Recent posts