diff --git a/best-time-to-buy-and-sell-stock/haung921209.md b/best-time-to-buy-and-sell-stock/haung921209.md new file mode 100644 index 000000000..ee99ca75f --- /dev/null +++ b/best-time-to-buy-and-sell-stock/haung921209.md @@ -0,0 +1,53 @@ +# 연관 링크 +- [문제 풀이 스케줄](https://github.com/orgs/DaleStudy/projects/6/views/5) +- [답안 코드 제출법](https://github.com/DaleStudy/leetcode-study/wiki/%EB%8B%B5%EC%95%88-%EC%A0%9C%EC%B6%9C-%EA%B0%80%EC%9D%B4%EB%93%9C) + +# Problem +- 문제 링크 : https://leetcode.com/problems/best-time-to-buy-and-sell-stock/ +- 문제 이름 : Best Time to Buy and Sell Stock +- 문제 번호 : 121 +- 난이도 : easy +- 카테고리 : + +# 문제 설명 + + +# 아이디어 +- 어떤 방법으로 접근했는지 서술 +- 포스 vs 최적화 아이디어 차이 등 +- 잡도에 대한 고려 + +# ✅ 코드 (Solution) + +```cpp +class Solution { +public: + int maxProfit(vector& prices) { + int localMax = prices[prices.size()-1]; + int res = 0; + for(int i=prices.size()-2;i>=0;i--){ + localMax = max(localMax, prices[i]); + res = max(res, localMax-prices[i]); + } + + return res; + } +}; +``` + +# 🔍 코드 설명 + +- local max를 설정 + +# 최적화 포인트 (Optimality Discussion) +• 최적화한 이유와 원리 +• 더 줄일 수 있는 여지는 있는가? +• 기존 방법 대비 얼마나 효율적이었는지 + +# 🧪 테스트 & 엣지 케이스 + +# 📚 관련 지식 복습 + +# 🔁 회고 + + diff --git a/group-anagrams/haung921209.md b/group-anagrams/haung921209.md new file mode 100644 index 000000000..07c268dbe --- /dev/null +++ b/group-anagrams/haung921209.md @@ -0,0 +1,60 @@ +# 연관 링크 +- [문제 풀이 스케줄](https://github.com/orgs/DaleStudy/projects/6/views/5) +- [답안 코드 제출법](https://github.com/DaleStudy/leetcode-study/wiki/%EB%8B%B5%EC%95%88-%EC%A0%9C%EC%B6%9C-%EA%B0%80%EC%9D%B4%EB%93%9C) + +# Problem +- 문제 링크 : https://leetcode.com/problems/group-anagrams/description/ +- 문제 이름 : Group Anagrams +- 문제 번호 : 49 +- 난이도 : medium +- 카테고리 : + +# 문제 설명 + + +# 아이디어 +- string을 정렬 -> key로 사용 가능 + - 정렬을 이용해 서로 다른 permutation(anagram)들을 같은 그룹으로 묶음. +- unordered_map을 사용해서 key lookup이 평균적으로 **O(1)**에 가능하므로 전체 알고리즘은 매우 효율적임. + +# ✅ 코드 (Solution) +``` +class Solution { +public: + vector> groupAnagrams(vector& strs) { + vector> res; + unordered_map> um; + for(auto str: strs){ + string key= str; + sort(key.begin(), key.end()); + um[key].push_back(str); + } + for(auto vec = um.begin();vec != um.end(); vec++){ + res.push_back(vec->second); + } + return res; + } +}; + +``` +# 🔍 코드 설명 +- length가 10^4 이하 + sort -> input 상 상수 시간 내 처리 가능 + - 정렬을 이용해 서로 다른 permutation(anagram)들을 같은 그룹으로 묶음. +- unordered_map을 사용해서 key lookup이 평균적으로 **O(1)**에 가능하므로 전체 알고리즘은 매우 효율적임. +- + +# 최적화 포인트 (Optimality Discussion) +- 불필요한 문자열 복사 방지: + - for(auto& str : strs) 처럼 auto 뒤에 &(레퍼런스) 를 사용하면, str을 복사하지 않고 참조로 받아 메모리 사용을 줄일 수 있음. +- key string 생성 비용 줄이기: + - 문자열을 매번 정렬하면 O(K log K) (K는 문자열 길이) 비용이 듦. + - 만약 모든 입력 문자열이 영어 소문자(a~z)로 제한된다면, 26개 알파벳의 빈도수 배열을 사용해서 O(K)로 key를 만들 수도 있음. + - 이 경우 정렬이 아니라 counting 기반 key 생성. + +# 🧪 테스트 & 엣지 케이스 + +# 📚 관련 지식 복습 + +# 🔁 회고 + +