목록전체 글 (393)
나의 발자취
Two Pointers?리트코드 알고리즘 문제에서 정~말 많이 사용되는 유형으로, 보통 데이터 구조가 선형 구조이고, 데이터의 연산이 두 개의 포인터를 가지고 연속적으로 해야할 때 사용된다. 대표적인 유형으로는 Two Sum이 있다. ㅎ투 포인터 기법을 쓰는 이유는 뭣보다도 시공간 복잡도가 O(N)에 처리될 수 있는 장점때문이다.이 말고도 문자열이 palindrome인지 구분할때에도 쓸 수 있고, 더 많은 전형적인 유형들은 아래에서 다루어볼 것이다. In Real-World Problems대학교에서는 알고리즘에 관하여 이렇게는 안알려주는 것 같은데, 이것이 왜 필요한 기법인지 납득이 가야지만 알고리즘을 잘 활용하는 나같은 유형의 경우 이걸 좀더 일찍 알았더라면~ 하는 아쉬움은 있다.따라서 무작정 '알고..

문제 링크https://leetcode.com/problems/increasing-triplet-subsequence/description/?envType=study-plan-v2&envId=leetcode-75 문제 접근 방법greedy 고민한 부분처음에는 루프 순회를 역으로 하려다가.. 아닌것같아서 바로 접었다. 코드class Solution: def increasingTriplet(self, nums: List[int]) -> bool: first = second = float('inf') # first와 second 초기화 for num in nums: if num

문제 링크 https://leetcode.com/problems/can-place-flowers/description/?envType=study-plan-v2&envId=leetcode-75 문제 접근 방법1) 점화식일단 0의 갯수와 꽃을 심는 개수의 상관관계를 파악하기 위해 패턴을 분석해보니 0이 3개가 연속으로 있을 때 1개까지 심을 수 있고, 0이 5개일 때 2개, 7개일 때 3개... 이런 식으로 되는 것 같았다.점화식을 세우고 이걸 활용하기로. 고민한 부분후. 조건 처리를 생각하느라 골치 아팠다.연속하는 애들을 어떻게 케이스를 나누어 처리할건지였는데,일단 0이면 꽃을 심을 수 있는 공간이니 consecitive_zeros에다가 1을 더해주고,그렇지 않은 경우(1인 경우)에는 consecitiv..

문제 링크https://leetcode.com/problems/reverse-vowels-of-a-string문제 접근 방법일단 주어진 예시를 가지고 어떻게 해야 효율적으로 모음을 바꿔서 리턴할 수 있을지 패턴을 분석해봤다. reverse가 들어간다는 것은, 가장자리에 있는 것들은 저들끼리 바뀌고, 안쪽에 있는 것들은 저들끼리 바뀌기 때문에-> swap 의 개념이 들어가지 않을까.. 하고-> swap이라면 각각 좌/우에서 포인터가 존재해서 점점 인덱스를 늘려/줄여가면서 가운데에서 만나면 연산 횟수가 효율적이라고 생각되었다. 고민한 부분1) 루프 순회 방법위의 패턴을 분석하기 전에는 루프 순회를 어떻게 할지 고민이 되었는데, 마지막 생각을 했던 부분에서 루프의 조건을 left 2) swap을 어떻게 처리..

문제 링크https://leetcode.com/problems/kids-with-the-greatest-number-of-candies/description 문제 접근 방법난이도가 Easy라 별도로 활용해야하는 알고리즘은 없었다. 굳이 따지자면 그리디? 고민한 부분for 루프의 인덱스가 되는(candy + extraCandy) element가 해당 리스트(candies)에서 최댓값인지 식별을 해야 하는데, 이 방법을 어떻게 해야 복잡도를 최소화하는지 고민이 되었다. 해결한 방법어차피 extraCandies를 더하는건 순차적이고, 더하게 되는 순간부터는 주어진 candies 리스트의 요소들과 비교하는 것이므로 처음부터 max값을 뽑아서 변수로 지정을 해놓는다. 주의사항리스트에 append로 문자열을 추가하..

음.. 새해니까 가볍게 몸풀기로 시작 하루에 최소 하나의 문제를 재미로 풀어보는 시간을 가지겠다.https://leetcode.com/problems/merge-strings-alternately/description/ 푸는 시간은 파이썬으로 10분 걸렸고 시간 복잡도는 O(N)이라 메모리 효율도는 높은 편이다. 문제 접근 방법단순히 이중 루프를 활용하는 것이 아니라 인덱스가 같다는 개념을 활용하면 루프 하나 안에서 문자열을 결합할 수 있다. 주의사항다만, index out of range 에러 해결을 위해 for loop 안에 if 조건을 추가해주어야한다.이 조건문 없이 그대로 실행하게 되면, 문자열의 길이가 같다는 전제만 되기 때문에 주어진 문제와 같이 word1과 word2가 다른 길이를 가질..
Alamofire의 DataResponse에서 실제 응답 데이터는 .data 프로퍼티를 통해 접근해야 한다. 데이터에 한번 담겨서 오기 때문~ 예를 들어// 잘못된 접근UserDefaults.standard.set(response.userId, forKey: "userId") // ❌ // 올바른 접근UserDefaults.standard.set(response.data.userId, forKey: "userId") // ✅ Alamofire에서 사용하는 응답 처리 메서드 responseDecodable: JSON 응답을 Codable 객체로 디코딩 .responseDecodable(of: CheckTodayUploadResponse.self) { response in // respons..

개발하려는 사항유저가 이미 참여하고 있는 챌린지면, ChallengeDetailView에서 "나도 참여하기" 버튼이 보이면 안되고 대신 progress bar, 그리고 카메라 버튼이 보여야한다.유저의 챌린지 참여 상태를 계속 기억해야하고, 유저의 챌린지 참여 기간이 끝날때까지 유저는 이 뷰를 봐야한다.유저가 참여중인 챌린지는 챌린지 뷰모델에서 fetchParticipatingChallenges, isParticipatingIn 와 관련되어있다. 일단, 챌린지 디테일 뷰에서, 챌린지 뷰모델을 참고하고 있다.이 뷰 모델의 어노테이션을 ObservedObject에서 StateObject로 바꿔준다. 1. @ObservedObject뷰가 다시 그려질 때마다 새로운 인스턴스가 생성될 수 있음부모 뷰로부터 전달받..