Programming/leetcode

821. Shortest Distance to a Character

홍열 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