-
821. Shortest Distance to a CharacterProgramming/leetcode 2021. 2. 8. 10:50728x90
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