LeetCode/Excel Sheet Column Title
[ 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)
Reference
이 문제에 관하여(LeetCode/Excel Sheet Column Title), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mhiro216/items/ff9845eb3eabf584c718텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)