fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 17828 (C++) 문자열 화폐
최초 업로드: 2025-09-14 10:19:16
최근 수정 시간: 2025-09-14 10:19:16
게시자: rlatjwls3333
카테고리: 백준
조회수: 5
# [Silver I] 문자열 화폐 [문제 링크](https://www.acmicpc.net/problem/17828) ## 문제 설명 <p>작년에 소수나라에 다녀온 하나는, 올해는 문자열나라로 관광을 가려고 한다. 문자열나라에서는 특이하게 알파벳 대문자로 구성된 문자열을 화폐로 사용한다.</p> <p>문자열나라에서 'A'는 1의 가치, 'B'는 2의 가치, ..., 'Z'는 26의 가치를 가지고 있으며, 이 알파벳들을 붙여 화폐로 쓰일 문자열을 만든다. 예를 들어, "HONGIK"의 가치는 8 + 15 + 14 + 7 + 9 + 11 = 64가 된다.</p> <p>소수나라에서 특이한 화폐 때문에 큰 스트레스를 받았던 하나는, 이번에는 정확한 소비 계획을 세워 미리 문자열 화폐로 돈을 환전해가려고 한다. 하나가 가져갈 문자열은 딱 하나이며, 길이는 <em>N</em>이고, 가치는 <em>X</em>여야 한다. 그리고 물론 알파벳 대문자로만 이루어져 있어야 한다.</p> <p>그런데 환전소에서는 사전 순으로 앞서는 문자열을 우선적으로 환전해준다고 한다! 여행 준비에 정신이 없는 하나를 위해, 조건을 만족하면서 사전 순으로 가장 앞서는 문자열 구해주자.</p> ## 입력 <p>첫 번째 줄에 문자열의 길이 <em>N</em>(1 ≤ <em>N</em> ≤ 5,000,000)과, 문자열의 가치를 나타내는 정수 <em>X</em>(1 ≤ <em>X</em> ≤ 500,000,000)가 공백으로 구분되어 주어진다.</p> ## 출력 <p>첫 번째 줄에 조건을 만족하는 문자열 중, 사전 순으로 가장 앞서는 것을 출력한다. 만약 그런 문자열이 하나도 존재하지 않으면, "<code>!</code>"(따옴표 없이)를 출력한다.</p> ## 풀이 뒤에서부터 그리디하게 가장 큰 문자를 배치하면 됩니다. ``` c++ #include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, x; cin >> n >> x; if(x<n || n*26<x) { cout << '!'; return 0; } vector<char> ch; while(n) { int cur = min(x-n+1, 26); ch.push_back(cur+'A'-1); n--; x -= cur; } for(int i=ch.size()-1;i>=0;i--) cout << ch[i]; } ```