부부의 코딩 성장 일기

LeetCode 168(Excel Sheet Column Title, Python) 본문

Algorithm/LeetCode

LeetCode 168(Excel Sheet Column Title, Python)

제로_콜라 2023. 12. 4. 19:00

1. 문제 링크

2. 문제 설명

  • 1이 주어지면 A, 26이 주어지면 Z
  • 27이 주어지면 AA, 28이 주어지면 AB 와 같은 규칙으로 수가 주어졌을 때 문자열을 반환
  • 즉 엑셀의 n번째 열이름을 생각하면 되고 A부터 Z까지 26개이니 26진법으로 생각
  • 26진법이면 26으로 나눈 나머지가 0부터 25까지 나옴
  • 그런데 A~Z까지 0을 나타내는 수가 없다는 것에 유의, 즉 0이 아니라 1이 A가 되고 26이 Z가 되어 1부터 26까지 나와서 하나의 차이가 존재함

3. 처음 풀이

class Solution:
    def convertToTitle(self, columnNumber: int) -> str:
				#26으로 나눈 나머지가 0부터 25까지이니 0:'A' 부터 25:'Z'에 대응시켜둔다. 
				#1이 주어지면 1을 뺀 후 26으로 나눈 나머지가 0이므로 'A'
				#26이 주어지면 1을 뺀 후 26으로 나눈 나머지가 25이므로 'Z'
				#27이 주어지면 1을 뺀 후 26으로 나눈 나머지가 0이므로 'A', 몫이 1이므로 여기서 또 1을 뺀 후 26으로 나눈 나머지가 0이므로 'A', 따라서 역순으로 이으면 'AA'
				#28이 주어지면 1을 뺀 후 26으로 나눈 나머지가 1이므로 'B', 몫이 1이므로 여기서 또 1을 뺀 후 26으로 나눈 나머지가 0이므로 'A', 따라서 역순으로 이으면 'AB'
        numToAlpha = {
            0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E',
            5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J',
            10: 'K', 11: 'L', 12: 'M', 13: 'N', 14: 'O',
            15: 'P', 16: 'Q', 17: 'R', 18: 'S', 19: 'T',
            20: 'U', 21: 'V', 22: 'W', 23: 'X', 24: 'Y', 25: 'Z'
        }
        result = ''
        num = columnNumber-1
        while num>=0:
            result = numToAlpha[num%26]+result
            num = num//26-1
        return result

4. 다른 풀이

  • 이 경우는 26으로 나눈 나머지를 0부터 25까지가 아니라 1부터 26으로 강제 조정하는 방법
  • 26으로 나눈 나머지가 0이면 26으로 바꾼다.
  • 즉, 26으로 나눈 나머지가 1~25이면 그대로 반영, 0이면 26으로 반영
  • 나머지가 0일 때만 그 다음 몫에서 1을 빼서 반영
class Solution:
    def convertToTitle(self, columnNumber: int) -> str:
        res = []
        k = columnNumber
        while k:
            q, r = divmod(k, 26)
            res.append(r if r > 0 else 26)
            k = q if r > 0 else q - 1
    
        s = [chr(i + ord('A') - 1) for i in res[::-1]]
        return ''.join(s)

5. 배운 점

  • 몫과 나머지를 한번에 반환하는 함수 divmod
q, r = divemod(a, b) #a를 b로 나눈 몫 q, 나머지 r
  • 문자를 받고 해당하는 유니코드를 반환하는 ord 함수와 유니코드를 받고 해당하는 문자를 반환하는 chr 함수
ord('A') #65
ord('B') #66

chr(65) #'A'