코딩테스트
[LeetCode/C#] Two Sum
tita
2024. 12. 27. 00:38
문제 출처 : https://leetcode.com/problems/two-sum/description/
[문제]
해당 문제는 주어진 배열 nums 와 정수 target 이 있을 때, 두 숫자의 합이 target 이 되는 배열의 인덱스를 반환하는 문제입니다.
[조건]
(1) 입력에는 반드시 하나의 정답만 존재합니다.
(2) 같은 원소를 두 번 사용할 수 없습니다.
(3) 반드시 하나의 정답이 존재합니다.
public class Solution {
public int[] TwoSum(int[] nums, int target) {
// Dictionary를 사용하여 숫자 값과 해당 인덱스를 저장
Dictionary<int, int> numMap = new Dictionary<int, int>();
// nums 배열을 순회
for (int i = 0; i < nums.Length; i++) {
// 현재 숫자(nums[i])의 보완 숫자(complement) 계산
int complement = target - nums[i];
// 보완 숫자가 Dictionary에 있는지 확인
if (numMap.ContainsKey(complement)) {
// 존재한다면, 현재 인덱스(i)와 보완 숫자의 인덱스를 반환
return new int[] { numMap[complement], i };
}
// 현재 숫자가 Dictionary에 없으면 추가
// 중복된 키는 허용되지 않으므로 기존 값을 덮어쓰지 않음
if (!numMap.ContainsKey(nums[i])) {
numMap[nums[i]] = i;
}
}
// 입력 데이터가 항상 유효하다는 조건이 있지만, 그렇지 않은 경우 예외 발생
throw new InvalidOperationException("No solution found");
}
}
[시간 복잡도]
반복문 : 배열을 한 번 순회하므로 O(n)
Dictionary 의 검색 및 삽입은 O(1) 이므로
전체 시간 복잡도는 O(n) 이 됩니다.
[공간 복잡도]
추가로 사용하는 Dictionary 의 크기는 최대 nums.Length 와 같으므로 공간 복잡도는 O(n) 입니다.