Skip to content

Conversation

changhoon-sung
Copy link
Contributor

@changhoon-sung changhoon-sung commented Jul 21, 2025

답안 제출 문제

작성자 체크 리스트

  • Projects의 오른쪽 버튼(▼)을 눌러 확장한 뒤, Week를 현재 주차로 설정해주세요.
  • 문제를 모두 푸시면 프로젝트에서 StatusIn Review로 설정해주세요.
  • 코드 검토자 1분 이상으로부터 승인을 받으셨다면 PR을 병합해주세요.

검토자 체크 리스트

Important

본인 답안 제출 뿐만 아니라 다른 분 PR 하나 이상을 반드시 검토를 해주셔야 합니다!

  • 바로 이전에 올라온 PR에 본인을 코드 리뷰어로 추가해주세요.
  • 본인이 검토해야하는 PR의 답안 코드에 피드백을 주세요.
  • 토요일 전까지 PR을 병합할 수 있도록 승인해주세요.

@solbijae solbijae self-requested a review July 21, 2025 01:26
@changhoon-sung changhoon-sung marked this pull request as ready for review July 21, 2025 01:28
for(auto it = nums.begin(); it != nums.end(); it++) {
int x = *it;
if (s.find(target - x) != s.end()) {
return std::vector<int>(x, target-x);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 이 문제 통과 되셨을까요? 이 부분에서 문제가 없었는지 궁금합니다!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

잘 체크해주셔서 감사합니다. 원소가 아닌 인덱스를 반환하는 문제였군요. 값을 key로, 인덱스를 value로 하는 map을 사용해서 O(1)에 인덱스 쿼리해서 벡터로 추가 및 반환할 수 있습니다.

#include <vector>
#include <unordered_map>

class Solution {
public:
    std::vector<int> twoSum(std::vector<int>& nums, int target) {
		std::unordered_map<int, int> m;
		std::vector<int> ans;

		for(auto it = nums.begin(); it != nums.end(); it++) {
			int x = *it;
            int idx = it - nums.begin();
			if (m.find(target - x) != m.end()) {
				ans.push_back(idx); ans.push_back(m[target-x]);
                return ans;
			} else {
				m[x] = idx;
			}
		}
		
		// 문제의 조건에서 단 하나의 솔루션이 반드시 존재한다고 가정하므로, 이곳에 도달하지 않음.
		throw std::runtime_error("No two sum solution found");
    }
};

Comment on lines +4 to +22
접근 1: 가장 단순한 접근법은 모든 원소에 대해 map으로 빈도를 세는 것입니다.
ordered_map에서 삽입 비용은 자료구조 길이가 K일 때 O(logK)으로, N회 삽입 연산으로 O(NlogK) 인데,
이때 모든 원소가 유일한 경우 K=N이므로 최악의 경우 O(NlogN) 입니다.
그리고 정렬된 맵에서 k 위치를 찾는 lower_bound 연산 비용은 O(logN)으로, 총 O(NlogN)입니다.
unordered_map은 삽입 비용이 O(1)이지만, N회 삽입 연산 이후, k를 찾기 위해 카운트를 정렬해야 한다는 점에서
보편적인 정렬 비용 O(Nlog(N))이 발생합니다.
접근 2: 총 비용이 O(NlogN)보다 낮아지려면 정렬 자료구조의 입력 비용이 O(logN)보다 낮거나,
정렬 비용이 O(NlogN)보다 낮아야 합니다.
한 가지 아이디어는 정렬 자료구조의 입력을 비용을 낮추는 필터 및 셋 기반 블랙리스트를 도입할 수 있다는 것입니다.
- k초과 원소 필터: k보다 높은 빈도를 가지는 원소를 자료구조에서 제거 및 블랙리스트
- k도달 불가 원소 필터: 현재 조회중인 입력에 대해 남은 원소의 수가 모두 해당 원소더라도 k에 미치지 못 하는 경우 제거 및 블랙리스트
필터에 해당하는 원소가 M개일 때, 필터 비용은 해시셋 조회 O(1), 삽입 비용은 O(log(N-M))으로
모든 입력에 대한 총 비용은 O(Nlog(N-M))입니다.
공간 복잡도는 최악의 경우에도 입력의 상수배이므로 O(N)입니다.
접근 3: 우리가 원하는 것이 k 빈도 딱 하나라는 것을 고려하면, 해당 빈도를 키로 원소를 반환받는 구조를 생각해볼 수 있습니다.
아이디어는 원소-카운팅맵으로 전체 입력에 대해 비용 O(N)으로 카운팅하고, 이를 바탕으로 카운팅-원소 해시맵으로 <빈도, 원소셋>을 빌드하는겁니다.
해당 빌드 비용은 최대 N개 원소에 대해 조회+삽입 O(1) 이므로 O(N)입니다.
필요한 정보는 카운팅-원소 해시맵으로 O(1) 조회 및 O(N) 반환합니다.
공간 복잡도는 최악의 경우에도 입력의 상수배이므로 O(N)입니다.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여러 접근 정리해주신게 인상깊습니다👍

@solbijae solbijae merged commit 6bb898f into DaleStudy:main Jul 26, 2025
1 check passed
@yhkee0404
Copy link
Contributor

Projects의 오른쪽 버튼(▼)을 눌러 확장한 뒤, Week를 현재 주차로 설정해주세요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Solving
Development

Successfully merging this pull request may close these issues.

3 participants