▼ 문제 바로가기 (링크) ▼
https://leetcode.com/problems/cells-in-a-range-on-an-excel-sheet/submissions/
Input: s = "K1:L2"
Output: ["K1","K2","L1","L2"]
문자열 s가 주어진다. s는
엑셀과 같이 행(row)은 1부터 n까지의 정수로 나타내고
열(columns)은 A부터 Z로 나타낸 2차원 배열이 있다고 할 때
시작 cell부터 끝나는 cell을 나타낸다.
시작하는 열의 1행부터 끝행까지 , 끝나는 열의 1행부터 끝행까지를
순서대로 담는 문자열을 반환하는 문제.
시작 알파벳과 끝 알파벳 사이에 있는 알파벳을 순서대로 출력해야하므로,
대문자 알파벳이 담긴 리스트를 먼저 생성했다.
alpha = list(ascii_uppercase) # 0 ~ 26번 인덱스까지 A-Z
# print(alpha) ['A', 'B', ... 'Y', 'Z']
a-z 는 ascii 를 리스트로 감싸서 순차 출력하거나 변수에 담을 수 있다.
소문자는 ascii_lowercase.
start, end = (s.split(":"))[0] , (s.split(":"))[1]
start = start[0:1],start[1:2]
end = end[0:1], end[1:2]
그 다음 s를 .split(":")로 시작과 끝으로 나누고
각각 알파벳과 숫자 단위까지 나눠서 갖는 리스트로 만들었다.
start = ["A", "1"]
end = ["C", " 2"]
예를 들면 이렇게.
row_min = min(int(start[1]),int(end[1])) # 행의 최소값
row_max = max(int(start[1]),int(end[1])) # 행의 최대값
s_i = alpha.index(start[0]) #알파벳의 시작 인덱스
s_e = alpha.index(end[0]) #알파벳 끝 인덱스
행의 최소, 최대값은 start와 end 변수의 숫자 부분 (1번 인덱스)
2개를 대소비교해서 얻을 수 있으므로 min(), max() 함수를 사용했다.
알파벳을 출력하려면 인덱스를 이용해야하므로
s_i, s_e 변수를 만들고 시작과 끝 알파벳을 alpha 변수에서 인덱스를 통해
가져올 수 있도록 만들었다.
특정 값의 인덱스는 리스트이름.index(값) 으로 알아낼 수 있다.
index,find 참고 https://ooyoung.tistory.com/78
answer = []
for i in range(s_i, s_e + 1):
for j in range(row_min, row_max + 1): #행 최소~최대값
answer.append(alpha[i] + str(j))
return answer
마지막으로 답을 담을 answer 리스트를 만들고
시작과 끝 알파벳 인덱스 for 문과
행 시작과 끝 값을 반복하는 for 문을 중첩시키고
answer에 알파벳 + 숫자 형태로 순서대로 추가되도록 만들었다.
완성된 코드.
class Solution:
def cellsInRange(self, s: str) -> List[str]:
alpha = list(ascii_uppercase) # 0 ~ 26번 인덱스까지 A-Z
start, end = (s.split(":"))[0] , (s.split(":"))[1]
start = start[0:1],start[1:2]
end = end[0:1], end[1:2]
row_min = min(int(start[1]),int(end[1])) # 행의 최소값
row_max = max(int(start[1]),int(end[1])) # 행의 최대값
s_i = alpha.index(start[0]) #알파벳의 시작 인덱스
s_e = alpha.index(end[0]) #알파벳 끝 인덱스
answer = []
for i in range(s_i, s_e + 1):
for j in range(row_min, row_max + 1): #행 최소~최대값
answer.append(alpha[i] + str(j))
return answer
이번 문제에서 배운 포인트는 2개.
1. ascii_uppercase /lowercase
2. .index()
이전에 pangram 문제를 풀 때도 a-z가 담긴 리스트를 만들었는데
그 때는 하드코딩으로 a부터 끝까지 입력했다.
쌍따옴표와 쉼표까지 하나하나..
분명 따로 기능이 있을 것 같아 찾아보고 처음 써본 ascii_uppercase
이전에 cs50 강의로 아스키코드에 대해 자세히 배운 적이 있기도 하고
이번에 쓰면서 너무 편해서 기분이 좋았기에 기억에 잘 남을 것 같다.
index는 그런 기능을 하는 함수가 있었던 건 아는데 문법이 기억이 안나서
검색해보고 문제에 적용하면서 익숙해질 수 있었다.
easy 난이도 문제를 어느정도 풀고 나면 이미 풀었던 문제를
리팩토링하면서 복습하면 재미있을 것 같다!
'코딩 테스트 > leetCode' 카테고리의 다른 글
[leetCode] 1773. Count Items Matching a Rule (Python) (0) | 2022.10.29 |
---|---|
[leetCode] 1528. Shuffle String (Python) (0) | 2022.10.29 |
[leetCode] 1967. Number of Strings That Appear as Substrings in Word (Python) (0) | 2022.10.29 |
[leetCode] 2427. Number of Common Factors (Python) (0) | 2022.10.28 |
[leetCode] 561. Array Partition (Python) (0) | 2022.10.26 |