정답)
class Solution:
def titleToNumber(self, columnTitle: str) -> int:
digit = len(columnTitle)-1
res = 0
for char in columnTitle:
res += (ord(char)-64) * 26**digit
digit -= 1
return res
문제)
엑셀의 열을 상징하는 스트링 columnTitle이 주어졌을 때, 그 열과 상응하는 숫자를 다음과 같이 리턴하시오.
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
예시 1)
columnTitle = "A"
output = 1
예시 2)
columnTitle = "AB"
output = 28
예시 3)
columnTitle = "ZY"
output = 701
제한)
1 <= columnTitle.length <= 7
columnTitle은 대문자 영어로만 이루어져 있습니다.
columnTitle은 "A" ~ "FXSHRXW"의 범위로 이루어져 있습니다.
풀이)
어려운 알고리즘이나 자료구조가 필요하지는 않습니다.
그저 알파벳을 어떤 원리를 이용하여 숫자로 바꿀 것인지 알아내는 게 중요하겠습니다.
저는 이 알파벳을 아래와 같이 26진수라고 가정하고 숫자로 변경해봤습니다.
이런 식으로 하기 위해선 각 문자가 몇 번째 자릿수인지를 구해야 하는데 그것은 columnTitle의 len을 이용해 줍니다.
물론 각 알파벳이 무슨 숫자를 나타내는지 또한 알아야 합니다.
'A'가 1
'B'가 2
'Z'가 26인 것처럼요.
이것은 ord()를 이용하여 받은 숫자에 64를 빼줘서 구해줍니다.
def titleToNumber(self, columnTitle: str) -> int:
digit, res 변수
columnTitle의 각 문자마다
res에 digit을 이용한 알맞은 숫자를 더하고
digit은 매 루프마다 1 빼줍니다
res를 리턴
초기세팅)
26진수를 활용하여 문제를 풀려면 각 알파벳이 몇 번째 자릿수인지 알아야 합니다.
왜냐하면 그 자릿수에 따라 26을 몇 번 제곱해야 되는지 갈리기 때문이죠.
"AB"의 경우 A는 1번째 B는 0번째 자릿수겠죠.
그래서 초기 digit을 len(columnTitle)-1로 해주겠습니다.
그러면 "AB"의 경우 len("AB")는 2이고
2에서 1을 빼주면 1이 되고
그 1이 A의 자릿수를 나타냅니다.
그리고 아웃풋이 될 res 변수에는 아무것도 아직 더해주지 않았으니 0으로 설정합니다.
def titleToNumber(self, columnTitle: str) -> int:
digit = len(columnTitle)-1
res = 0
숫자로 변환 후 res에 덧셈, digit은 뺄셈)
그러면 columnTitle의 문자를 선형 합시다.
대문자 알파벳의 ord() 범위는 65~90입니다
하지만 저희는 1~26을 원하죠.
그래서 알파벳의 제대로 상응하는 숫자를 구하기 위해서 ord() 후 64를 빼줍니다.
그리고 상응하는 숫자를 구했다면 26에 현재 자릿수를 제곱해 아까 구한 숫자에 곱해줍니다.
"AB"의 "A"를 보자면 ord('A')-64 = 65-64 = 1입니다.
그리고 아까 구했듯이 A의 현재 자릿수는 1이기 때문에 26에 1을 제곱해 위에서 구한 1에다 곱해줍니다
1 * 26^1 = 26
위와 같이 알파벳 문자를 변환해 주었다면 res에 더해줍니다.
그리고 다음 문자는 현재 문자보다 자릿수가 1 작기 때문에 digit에 1을 빼줍니다.
이런 식으로 columnTitle의 문자들을 전부 선형 했다면 res를 리턴합니다.
def titleToNumber(self, columnTitle: str) -> int:
digit = len(columnTitle)-1
res = 0
for char in columnTitle:
res += (ord(char)-64) * 26**digit
digit -= 1
return res
디버깅)
columnTitle = "AZB"
digit = 3-1 = 2
res = 0
(char = A)
res += 1 * 26^2
res = 676
digit = 1
(char = Z)
res += 26 * 26^1
res = 1352
digit = 0
(char = B)
res += 2 * 26^0
res = 1354
digit = -1
return 1354
이번 문제는 어떤 특정 알고리즘이 사용되진 않고 진수의 개념이 들어갔던 것 같습니다. 처음에는 숫자들이랑 알파벳이랑 엇갈려서 조금 어려웠는데 딱 정신 차리고 풀면 쉽게 풀 수 있는 문제인 것 같습니다. 요즘은 medium 단계의 문제들을 풀고 있는데 너무 어렵습니다 ㅎㅎ... 제가 모르는 알고리즘과 개념들이 많네요. 열심히 공부해 봅시다!
오늘도 풀이과정에 질문이나 잘못된 부분 있다면 알려주시면 감사하겠습니다 :)
'[LeetCode] > [Easy]' 카테고리의 다른 글
[Top Interview Questions] 191. Number of 1 Bits (0) | 2023.06.09 |
---|---|
[Top Interview Questions] 190. Reverse Bits (0) | 2023.06.08 |
[Top Interview Questions] 169. Majority Element (0) | 2023.06.06 |
[Top Interview Questions] 160. Intersection of Two Linked Lists (0) | 2023.06.05 |
[Top Interview Questions] 141. Linked List Cycle (0) | 2023.06.04 |