CodingTest/Baekjoon

[baekjoon] 백준 17828번(파이썬): 문자열 화폐

JunJangE 2021. 6. 6. 12:33

문제

 

17828번: 문자열 화폐

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

www.acmicpc.net

- 문자열 나라는 알파벳 대문자로 구성된 문자열을 화폐로 사용한다.

- 문자열 나라에서 '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

 

junjange/CodingTest

내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.

github.com