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

Python

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

問題

Excelスプレッドシートで、AからZ、AAからAZ、BAからBZ、…、ZZ、AAA、AAB、…というように、列は次のように表されます。列名が与えられた場合、その列が表す番号を返します。

解法

Excelの列名を数字に変換する方法は、それぞれの文字を26進数で考えることです。たとえば、AAの場合、Aは1、Bは2、…、Zは26として、A*26 + A = 27となります。この問題は、これを応用して解くことができます。

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

  1. 初期値を0に設定します。
  2. 文字列を1文字ずつ反復処理します。
  3. 各文字を26進数として計算し、初期値に加算します。
  4. 次の文字に移動します。
  5. 最終的な値を返します。

Pythonコード

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

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

def solve(num=0):
    
    solver  = Solution().titleToNumber
    
    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.columnTitle)
        result  = "OK" if ans==data.ans else "NG"
        print(f"[{str(id).zfill(3)}] {result}")

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

class Solution(object):
    
    def titleToNumber(self, columnTitle):
        """
        :type columnTitle: str
        :rtype: int
        """
        num = 0
        for char in columnTitle:
            num = num * 26 + (ord(char)-ord('A')+1)
        return num
    
    # def titleToNumber(self, columnTitle):
    #     """
    #     :type columnTitle: str
    #     :rtype: int
    #     """
    #     num = 0
    #     for id, char in enumerate(columnTitle[::-1]):
    #         num += 26**id * (ord(char)-ord('A')+1)
    #     return num

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

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

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

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

if __name__ == "__main__":

    solve()

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