프로그래머스보다 Leetcode 에 더 양질의, 좋은 자료가 많은 것 같아서 옮겨탔습니다. 특히 해외 빅테크 기업들의 코딩 인터뷰 문제들도 있다고하는데, 대부분 유료라... 무료 위주의 탑 100개 알고리즘을 풀어보는 게 목표입니다.
문제 정의
벡터 리스트가 주어졌을 때, 두 원소의 합이 target
이 되는 인덱스 값을 반환하는 문제입니다. 완전 탐색으로 쉽게 풀 수도 있지만, 그렇게하면 시간복잡도가 O(n^2)
이 되기 때문에 많이 느리더라구요. 본 문제는 구글 코딩 테스트 관련, 구글에서 공식적으로 제공하는 유튜브 영상에도 수록된 문제입니다.
접근 방법
- Hash map의
key
,value
형태를 활용합니다. Map은 순서가 있는 해시인데, 사실 꼭 순서가 중요하진 않습니다. 공부해볼 겸 Map을 가져다 사용했습니다. - for문을 돌려서 어레이의 원소에 차례대로 접근합니다. 그리고 해당 원소의 값을 키로, 값을 value로
insert
합니다. target
으로부터의 차이값을 계산하여 해당 차이만큼에 해당하는key
를 가진 원소가 과거에 있었는지를 봅니다. 있었다면 합이 target이 되는 원소가 있었다는 뜻이니, 차례대로 인덱스값을 answer에push_back
해줍니다.
Map 정리
기본적으로 map
을 c++에서 활용하기 위한 몇가지 구문을 정리해봤습니다. map은 키 값을 기준으로 order되는 형태이기 때문에 erase
할 때 유용하게 사용될 수 있는 것 같습니다. (인덱스 범위로 삭제) 그리고 find하는 시간복잡도는 O(1)
이므로 빠릅니다.
- 선언:
map<int, int> m; m[2] = 1
; - 삽입:
m.insert({3, 1});
(앞에가 key, 뒤에가 value) - 찾기:
m.find(3); if (m.find(key) != m.end()) {};
키값을 검색하고, 마지막까지 찾으면 m.end()를 반환. - 찾기2: for (auto it = m.begin() ; it != m.end(); it++) { cout << it->first << " " << it->second << endl; }`
- 기타: 여기 블로그에 잘 정리되어 있어서 링크 남깁니다.
코드 및 결과
- Runtime: 60 ms, faster than 39.22% of C++ online submissions for Two Sum.
- Memory Usage: 11.2 MB, less than 22.53% of C++ online submissions for Two Sum.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | vector<int> twoSum(vector<int>& nums, int target) { vector<int> answer; map<int, int> m; for (int i =0; i<nums.size(); i++) { m.insert({nums[i], i}); if (m.find(target-nums[i]) != m.end() && m[target-nums[i]] != i) { answer.push_back(m[target-nums[i]]); answer.push_back(i); cout << "found!\n"; break; } // 완전탐색 // for (int j=i+1; j<nums.size(); j++) { // if (nums[i] + nums[j] == target) { // answer.push_back(i); // answer.push_back(j); // } // } } return answer; } | cs |
'Developer > C, C++' 카테고리의 다른 글
[C++] LeetCode - Roman to Integer (Map) (1) | 2022.01.10 |
---|---|
[C++] LeetCode - Add Two Numbers (Linked List) (0) | 2022.01.07 |
[C++] 프로그래머스 - 더 맵게 (힙) (0) | 2022.01.05 |
[C++] 프로그래머스 - 주식가격 (스택/큐) (0) | 2022.01.04 |
[C++] 프로그래머스 - 다리를 지나는 트럭 (스택/큐) (0) | 2022.01.03 |
댓글