문제
- 문자열 나라는 알파벳 대문자로 구성된 문자열을 화폐로 사용한다.
- 문자열 나라에서 'A'는 1의 가치, 'B'는 2의 가치,..., 'Z'는 26의 가치를 가지고 있다.
- 이 알파벳들을 붙여 화폐로 쓰일 문자열을 만든다.
- 예를 들어, "HONGIK"의 가치는 8 + 15 + 14 + 7 + 9 + 11 = 64가 된다.
- 정확한 소비 계획을 세워 미리 문자열 화폐로 돈을 환전해가려고 한다.
- 하나가 가져갈 문자열은 딱 하나이며, 길이는 N이고, 가치는 X여야 한다.
- 물론 알파벳 대문자로만 이루어져 있어야 한다.
- 환전소에서는 사전 순으로 앞서는 문자열을 우선적으로 환전해준다고 한다
- 조건을 만족하면서 사전 순으로 가장 앞서는 문자열 구하는 문제이다.
알고리즘
- 문자열 길이와 환전해야 하는 가치를 입력받는다.
- 환전해야 하는 가치가 문자열 길이보다 작으면 문자열 길이만큼 환전할 수 없다.
- 환전해야 하는 하는 가치가 문자열 길이 * 26(제일 비싼 문자의 가치) 보다 크면 문자열 길이의 화폐로 환전해야 하는 가치만큼 환전할 수 없다.
- 가치 1 화폐, "A"를 n개만큼 리스트에 넣는다.
- 환전해야 하는 돈에서 1의 가치 n개를 일단 환전했으므로 빼준다.
- 리스트 수행을 위해 n - 1을 한다.(리스트에서 공간 1은 0이기 때문)
- 환전해야 하는 가치가 25보다 크거나 같으면 미리 환전했던 "A"를 "Z"로 바꿔준다.
- 환전해야 하는 가치가 25보다 작으면 환전했던 "A"를 나머지 환전해야 하는 가치 + 아스키 코드 문자로 바꿔준다.
- 환전해야 하는 가치가 0이 될 때까지 반복한다.
- 반복문을 통해 리스트에 있는 문자를 더해 문자열로 출력한다.
코드
import sys
n, x = map(int, sys.stdin.readline().split())
result = ""
# x가 n보다 작으면 n만큼 환전할 수 없다.
# x가 n * 26 보다 크면 n개의 화폐로 x의 가치만큼 환전할 수 없다.
if n > x or n * 26 < x:
print("!")
else:
# 가치 1 화폐, A를 n개만큼 리스트에 넣는다.
array = ["A"] * n
# 환전해야하는 돈에서 1의 가치 n개를 환전했으므로 빼준다.
x -= n
# 리스트 수행을 위해 n - 1을 한다.
i = n - 1
# x가 0이되면 멈춘다.
while x > 0:
# 환전해야하는 돈이 25와 같거나 클경우에 A를 Z로 바꿔준다.
if x >= 25:
array[i] = "Z"
i -= 1
x -= 25
# 환전해야하는 돈이 25보다 작을경우에 A를 환전해야하는 가치 + 아스키 코드 문자로 바꿔준다.
else:
array[i] = chr(x + 65)
break
# 반복문을 통해 리스트에 있는 문자를 더해주어 출력한다.
for j in range(n):
result += array[j]
print(result)
결과
위 코드에서 while문 바로 밑에 print(array)를 작성하게 되면 문자열 화폐가 어떤 형태로 환전하는지 다음 출력 화면과 같이 확인할 수 있다.
위 출력 화면을 보게 되면 처음에 "A"를 문자열 길이만큼 환전한 것을 알 수 있다. 그리고 조건문을 통해 환전해야 하는 가치 58이 25보다 크기 때문에 환전했던 "A"를 "Z"로 바꿔준 것을 확인할 수 있다. 여기서 조건이 25보다 큰지를 확인하는 이유는 이미 1의 가치 화폐로 환전했기 때문에 25보다 클 경우 26의 가치로 바꿔줄 수 있기 때문이다. 남은 환전금액 33도 25보다 크기 때문에 위 과정으로 "A"가 "Z"로 바꿔준 것이다. 마지막으로 위 출력 화면에는 나와있지 않지만 8이 25보다는 작기 때문에 "A"를 8과 65를 더한 아스키 코드인 'I"로 바꿔주어 반복문을 멈춰 준 것을 확인할 수 있다. 여기서 65를 더한 이유는 이미 위에서 1인 화폐 "A"로 환전했기 때문에 아스키 코드 65인 "A"를 더하기 위해서이다.
위 다른 예시의 출력 화면을 보도록 해보자. 코드에 처음 조건을 보게 되면 환전해야 하는 가치가 문자열 길이 * 26(제일 비싼 문자의 가치) 보다 크면 문자열 길이의 화폐로 환전해야 하는 가치만큼 환전할 수 없게 된다. 환전해야 하는 가치 157 이 6(문자열) * 26(제일 비싼 문자의 가치) = 156 보다 크기 때문에 위 조건으로는 화폐를 환전할 수 없게 된다. 따라서 "!"를 출력하게 되는 것이다.
github
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 11501번(파이썬): 주식 (0) | 2021.06.08 |
---|---|
[baekjoon] 백준 1092번(파이썬): 배 (0) | 2021.06.07 |
[baekjoon] 백준 1464번(파이썬): 뒤집기 3 (0) | 2021.06.05 |
[baekjoon] 백준 9576번(파이썬): 책 나눠주기 (0) | 2021.06.04 |
[baekjoon] 백준 2812번(파이썬): 크게 만들기 (0) | 2021.06.03 |