백준 17828 골드 5 문자열 화폐

사전 순으로 앞서는 문자열을 우선적으로 환전해준다고 한다! 여행 준비에 정신이 없는 하나를 위해, 조건을 만족하면서 사전 순으로 가장 앞서는 문자열 구해주자.
- 'A'로 초기화 하고 뒤 부터 'Z'를 채워보자
- 숫자로 연산을 하고 char()을 사용하여 넣어주자.
- 시간 제한을 고려하여 deque()를 사용하면 어떨까
from collections import deque
n,m = map(int, input().split()) # count , num
answer = deque()
if n * 26 < m or n > m: # 가능하지 않은 경우 !를 출력
print("!")
else:
for i in range(n):
left = n - i - 1; # 적어도 A 한개씩은 들어가야함
if m-left > 26: # 남은 수기 26보다 큰 경우
answer.appendleft("Z")
m = m-26 # m은 Z값을 뺀 만큼
else:
answer.appendleft(chr(m-left + 64))
m = m - (m-left)
print("".join(answer))
적어도 A가 1개씩은 들어가야 완성되기 때문에
모두 A를 길이에 맞춰 넣어도 가치가 충족되지 않거나 모두 Z를 넣어도 가치가 오버될 경우는 !를 프린트 하게 됩니다.
그 후 적어도 A가 한개씩 들어갔을 경우를 제외하고 남은 수가 26 즉, Z가 들어갈 수 있다면 Z를 append(left)하게 됩니다.
그 후 마지막은 "".join(answer)을 사용하여 문자열로 합쳐줬습니다.
처음엔
while을 사용하고 'A'를 놓고 시작 하려고 했는데,
풀다보니 그 부분을 놓치고 말았다는 생각이 들었다.
n,m = map(int, input().split()) # count , num
answer = ['A'] * n
if n * 26 < m or n > m:
print("!")
else:
m -= n
i = n - 1
while m > 0:
if m > 26: # 남은 수기 26p보다 큰 경우
answer[i] = 'Z'
i -= 1
m -= 25
else:
answer[i] = chr(m + 65) # 대문자 이므로 65부터 시작
break
print("".join(answer))
인덱스에 접근혹은 슬라이싱을 할 때는 , List가 O(1)로
deque보다 성능이 좋기 때문에 이부분은 삭제하고, 기존에 A를 채워놨기 때문에
Z가 아닌 경우 한번만 실행을 한 후에는 break로
시간복잡도도 대폭 줄일 수 있었다.
요즘, 책도 읽고 Spring 공부도... DDD도 공부하고 최근엔 해커톤도 진행하면서 꽤나 바쁜 하루를 살고 있는데... 그와중에 블로그를 잊지 않는 나 칭찬해.. 나머지들도 부지런하게 업로드 해야지