리트코드 알고리즘/리트코드 easy
(간단한 코드)리트코드 228. Summary Ranges
문학적 딥러닝
2024. 12. 10. 00:09
개인적으로 정말로 많이 마음이 꺾였던 문제였다.
해답을 보면서 "와... 이렇게 생각을 할 수 있구나"라는 생각을 했지만, 기본적으로 나는 while문을 정말로 싫어하고 잘 못 쓰기 때문에 가급적이면 for문으로 해결하고 싶었지만, 잘 안되었다.
class Solution:
def summaryRanges(self, nums: List[int]) -> List[str]:
ans = []
i = 0
while i < len(nums):
start = nums[i]
while i < len(nums)-1 and nums[i] + 1 == nums[i+1]:
i += 1 #여기의 i가 증가함에 따라, 바깥 쪽 i도 같이 증가하는게 맞다.
if start != nums[i]:
ans.append(f'{start}->{nums[i]}')
else:
ans.append(str(nums[i]))
i += 1
# 여기의 i는 안에 있는 while문이 끝났을 때 다음 i의 위치에 가는 역할도 하고
# 겉에 있는 while문에서 꺼내는 역할도 한다.
return ans
while문이 2개 있어서, 엄청나가 많은 경우의 수를 계산하는 것 같지만, 실상은 기준이 되는 i를 공유하고 있어서 그렇지 않다.
이런 말에 앞서 시간 복잡도(Time conflexity)가 뭔지도 잘 이해가 안가는 사람들도 많을 것이다. 간단하게 생각을 하자면, "컴퓨터가 얼마나 많은 데이터를 보느냐"를 생각해야 한다.
우선 답이 되는 ans(answer의 약자) 리스트와 인덱싱에 활용할 i=0를 만들어주고.
start = nums[i]가 헷갈릴 수 있다. 안에 있는 while문은 순서대로 나열되어 있는 숫자들 중, 다음 숫자가 규정에 맞다면 i는 계속해서 커지고, 그렇지 않으면 if문을 거쳐서 ans안에 답이 추가가 되는 과정을 거친후, 다음 i로 넘어간다.
답을 보고 나면 간단하지만, while문 안에 while문을 넣는다는 방식을 봤을 때는 너무나도 새로웠고, 이것이 동일한 i라는 기준을 활용하는것도 감탄을 했다.
https://www.youtube.com/watch?v=ZHJDwbfqoa8