문자열 화폐

Polla·2023년 5월 29일

백준BOJ

목록 보기
4/4
post-thumbnail

백준 17828 골드 5 문자열 화폐


💡 문제


사전 순으로 앞서는 문자열을 우선적으로 환전해준다고 한다! 
여행 준비에 정신이 없는 하나를 위해, 조건을 만족하면서 사전 순으로 
가장 앞서는 문자열 구해주자.


🥳 해결


생각

  1. 'A'로 초기화 하고 뒤 부터 'Z'를 채워보자
  2. 숫자로 연산을 하고 char()을 사용하여 넣어주자.
  3. 시간 제한을 고려하여 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가 들어갈 수 있다면 Zappend(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))

인덱스에 접근혹은 슬라이싱을 할 때는 , ListO(1)
deque보다 성능이 좋기 때문에 이부분은 삭제하고, 기존에 A를 채워놨기 때문에
Z가 아닌 경우 한번만 실행을 한 후에는 break
시간복잡도도 대폭 줄일 수 있었다.



잡담...

요즘, 책도 읽고 Spring 공부도... DDD도 공부하고 최근엔 해커톤도 진행하면서
꽤나 바쁜 하루를 살고 있는데... 그와중에 블로그를 잊지 않는 나 칭찬해..
나머지들도 부지런하게 업로드 해야지
profile
트러블 슈팅 Blog => https://polla.palms.blog/home

0개의 댓글