코딩 테스트/leetCode

[leetCode] 2194. Cells in a Range on an Excel Sheet (Python)

우주바다 2022. 10. 29. 05:51
728x90

▼ 문제 바로가기 (링크) 

https://leetcode.com/problems/cells-in-a-range-on-an-excel-sheet/submissions/

 

Cells in a Range on an Excel Sheet - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


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 난이도 문제를 어느정도 풀고 나면 이미 풀었던 문제를

리팩토링하면서 복습하면 재미있을 것 같다!

728x90
반응형