LeetCode/Excel Sheet Column Title

8628 단어 파이썬leetcode
( 블로그 기사 의 전재)

[ h tps : // / ㅇ t 여기. 코 m / p 로 b ㎇ ms / 에 x 세 l ]

Given a positive integer, return its corresponding column title as appear in an Excel sheet.

For example:
1 -> A
2 -> B
3 -> C
...
26 -> Z
27 -> AA
28 -> AB 
...

Excel 시트의 열 이름을 인덱스로 읽는 문제입니다. 실무로 필요하게 되는 것이 많을 것 같은 처리군요.

해답·해설



해법 1

우선, Discussion에 매우 멋진 정리표가 있었으므로 공유합니다.

열명과 인덱스의 대응은 이와 같이 되어 있습니다.

한 자리는 n을 26으로 나눈 나머지에 해당합니다. 깨진 경우는 Z에 대응합니다.
십위는 n을 26으로 나눈 때의 몫을 26으로 나눈 때의 나머지에 대응하고 있습니다. 깨진 경우는 Z에 대응합니다.
백위 이상도 마찬가지입니다.

그렇다면 {1:'A', 2:'B', ... , 25:'Y', 0:'Z'} 와 같은 열 이름과 인덱스의 대응을 포함한 사전을 만든 다음 ,
n을 26으로 나눈 나머지를 저장하고, 다음은 n을 26으로 나눈 몫을 26으로 나눈 나머지를 저장하고, 를 반복해 나가면 좋을 것처럼 일순간 생각됩니다.

단 하나 함정이 있고, 이 방법이라면 2 자리 이상의 ZZ, ZZZ 같은 Z만으로 구성된 열명으로 잘 작동하지 않습니다.
예를 들면 702는 본래 ZZ입니다만, 702/26의 몫은 27・남은 0, 27/26의 몫은 1・남은은 1로, AAZ가 되어 버립니다.
n을 26으로 나눌 때의 몫을 다음 루프로 돌리는 것이 아니라, n-1을 26으로 나눈 때의 몫을 다음 루프로 돌리면 잘 작동합니다.
from string import ascii_uppercase

class Solution(object):
    def convertToTitle(self, n):
        """
        :type n: int
        :rtype: str
        """
        d = {0:'Z'}
        for i,s in enumerate(ascii_uppercase):
            d[i+1] = s
        result = []
        while n > 0:
            result.append(d[n%26])
            n = (n-1) // 26
        result.reverse()
        return ''.join(result)

n을 26으로 나눈 나머지 값을 열 이름에 대응시키는 것은 {1:'A', 2:'B', ... , 25:'Y', 0:'Z'} 없음 {0:'A', 1:'B', ... , 24:'Y', 25:'Z'} 로서,
n-1을 26으로 나눈 때의 나머지 값을 열명에 대응시켜도 좋기 때문에 코드를 깔끔하게 할 수 있습니다.
from string import ascii_uppercase

class Solution(object):
    def convertToTitle(self, n):
        """
        :type n: int
        :rtype: str
        """
        d = {}
        for i,s in enumerate(ascii_uppercase):
            d[i] = s
        result = []
        while n > 0:
            result.append(d[(n-1)%26])
            n = (n-1) // 26
        result.reverse()
        return ''.join(result)

해법 2

해법 1에서는 string 라이브러리를 사용했습니다만, ord(s)로 아스키 코드를 꺼내 수열을 작성해, chr(n)로 문자에 되돌리는 것으로 A-Z의 문자열로 이루어지는 리스트를 만들 수 있습니다.
class Solution(object):
    def convertToTitle(self, n):
        """
        :type n: int
        :rtype: str
        """
        capitals = [chr(x) for x in range(ord('A'), ord('Z')+1)]
        result = []
        while n > 0:
            result.append(capitals[(n-1)%26])
            n = (n-1) // 26
        result.reverse()
        return ''.join(result)

좋은 웹페이지 즐겨찾기