Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- Python
- 재귀
- 이진트리
- string
- math
- 리트코드
- leetcode
- 문자열
- two pointers
- dfs
- sorting
- binary search
- 중간
- recursive
- hash table
- backtracking
- Depth-first Search
- Binary
- tree
- list
- 쉬움
- HashTable
- Medium
- DP
- linked list
- binary tree
- Array
- matrix
- 미디움
- easy
Archives
- Today
- Total
부부의 코딩 성장 일기
LeetCode 168(Excel Sheet Column Title, Python) 본문
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'
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode 171(Excel Sheet Column Number, Python) (0) | 2023.12.06 |
---|---|
LeetCode 169(Majority Element, Python) (0) | 2023.12.05 |
LeetCode 160(Intersection of Two Linked Lists, Python) (1) | 2023.12.03 |
LeetCode 144(Binary Tree Preorder Traversal, Python) (0) | 2023.12.02 |
LeetCode 145(Binary Tree Postorder Traversal, Python) (0) | 2023.12.01 |