【競技プログラミング】「Excel Sheet Column Title」with Python | LeetCode #168

Python

こちらは「Excel Sheet Column Title」のPythonによる解答例となっております。この問題は、与えられた数値をExcelの列名に変換する問題です。

問題

Excelシートの列番号が与えられたとき、対応する列名を返します。

  • 列番号は1から始まります。
  • 列名は、1つ以上の大文字アルファベットから構成されます。
  • 列名は、AからZ、AAからAZ、BAからBZ、…、AAAからZZZまでの範囲内にあります。

解法

この問題は、余りを利用した再帰的なアプローチがあります。26進数に似た、1から始まる数字をExcelの列名に変換することができます。

アルゴリズムの概要を以下に述べます。

  1. 10進数の数値を26進数に変換します。
  2. 余りを計算します。
  3. 余りから文字を生成します。
  4. 商を新しい入力として、再帰的に手順1-3を繰り返します。
  5. 列名を反転して返します。

Pythonコード

以下のコードが、「Excel Sheet Column Title」を解くためのPythonプログラムとなります。

### Function ##################################################################

def solve(num=0):
    
    solver  = Solution().convertToTitle
    
    if 1 <= num <= Input().input: id_LIST = [num]
    else: id_LIST = [id+1 for id in range(Input().input)]
    
    for id in id_LIST:
        data    = Input(id)
        ans     = solver(data.columnNumber)
        result  = "OK" if ans==data.ans else "NG"
        print(f"[{str(id).zfill(3)}] {result}")

### Class #####################################################################

class Solution(object):
    
    def convertToTitle(self, columnNumber):
        """
        :type columnNumber: int
        :rtype: str
        """
        capitals = [chr(x) for x in range(ord('A'), ord('Z')+1)]
        
        result = []
        while columnNumber > 0:
            result.append(capitals[(columnNumber-1)%26])
            columnNumber = (columnNumber-1) // 26
        result.reverse()
        return ''.join(result)

#==============================================================================

class Input:
    
    def __init__(self, num=0):
        
        if num == 1:
            self.columnNumber = 1
            self.ans    = "A"
        
        elif num == 2:
            self.columnNumber = 28
            self.ans    = "AB"

        elif num == 3:
            self.columnNumber = 701
            self.ans    = "ZY"
        
        else:
            self.input  = 3

### Main ######################################################################

if __name__ == "__main__":

    solve()

###############################################################################