ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 821. Shortest Distance to a Character
    Programming/leetcode 2021. 2. 8. 10:50
    728x90

    ee난이도 쉬움이라 가볍게 풀 수 있겠다 싶었는데..

     

    python의 리스트 슬라이싱을 헤메서 좀 고생했다. 

    역순으로 배열할꺼면 끝값을 지정안해줘도 되는데, 자꾸 습관적으로 지정해서 

    왜 안될까 2시간을 고민했다. 

     

    문제 자체는 쉽다.

    주어진 s 라는 문자열에서 c 문자까지 거리를 측정하는데, 앞뒤중에서 짧은 것을 저장하면 된다. 

     

    리스트 슬라이싱과 find로 해결하였다. 

     

        def shortestToChar(self, s: str, c: str) -> List[int]:
            result = []
    
            for i in range(len(s)):
                left_lst = s[i::-1]
                right_lst = s[i:len(s):1]
                
                lst_pos = left_lst.find(c)
                rst_pos = right_lst.find(c)
                
                if lst_pos >=0 and rst_pos>=0:
                    result.append(min(lst_pos, rst_pos))
                elif lst_pos >= 0 and rst_pos == -1:
                    result.append(lst_pos)
                elif lst_pos == -1 and rst_pos >= 0:
                    result.append(rst_pos)
            return result

     

     

    내가 푼 방법보다 좋은 아이디어가 있어 정리차원에서 써둠

     

    결국 현재 위치에서 c라는 문자와의 거리를 측정하는 것인데, 

     

    정방향으로 진행하면서 내 위치 이전의 c 문자의 위치를 기록해두고, 특정 배열에 넣어둔다

    두번째로는 뒤에서 앞으로 오면서 위치를 비교해서 min값을 넣어주면 된다.

     

     

    만약 "aaba"이고 "b"라는 문자와의 거리를 생각해보면 

     

    i = 0일때, 아직 b의 위치를 못찾았으니 sys.maxSize를 넣고

    만약 b를 만나면 b의 위치를 저장하고 다음 문자부터는 b와의 거리를 빼준것을 기록한다. 

     

    이제 배열을 뒤로 뒤집어서 b라는 문자의 위치를 기록, 값을 구한다. 

     

        def shortestToChar(self, S: str, C: str):
        	# ex) S = "aaba", C = "b"
            start = -sys.maxsize
            res = []
            for i in range(len(S)):
                if S[i] == C:
                    start = i
                res.append(i - start)
            
            # 여기까지 끝나면 res = [999999999, 999999999, 0, 1]이 저장되어 있다. 
            # b의 index가 2이므로 i가 2 이후에는 현재 b의 위치를 가지고 계산.
            
            start = sys.maxsize
            # reversed(range(len(s))를 하면 3,2,1,0 순으로 내려간다....
            
            for i in reversed(range(len(S))):
                if S[i] == C:
                    start = i
                res[i] = min(res[i], start - i)
            
            return res
    

     

     

    'Programming > leetcode' 카테고리의 다른 글

    2. Add Two Numbers  (0) 2021.02.08
    206. Reverse Linked List  (0) 2021.02.08
    21. Merge Two Sorted Lists  (0) 2021.02.05
    1148. Longest Harmonious Subsequence  (0) 2021.02.04
    141. Linked List Cycle  (0) 2021.02.04
Designed by Tistory.