해시 테이블 기초 및 주요 문제 풀이

해시 테이블 이론

해시 함수는 hashCode를 통해 데이터를 해시 테이블의 인덱스로 변환합니다. 해시 충돌은 서로 다른 데이터가 동일한 인덱스에 매핑될 때 발생하며, 주로 체이닝(연결 리스트 사용) 또는 개방 주소법(다음 빈 공간 사용)으로 해결합니다. 해시 테이블은 특정 요소의 집합 존재 여부를 빠르게 확인해야 할 때 효과적입니다. 배열도 해시 테이블의 일종으로, 요소 존재 확인을 O(1) 시간에 처리할 수 있습니다.

주요 해시 컨테이너 비교

컬렉션구현순서중복변경조회삽입/삭제
set레드-블랙 트리정렬됨불가불가O(log n)O(log n)
unordered_set해시 테이블무순불가불가O(1)O(1)
매핑구현순서키 중복키 변경조회삽입/삭제
map레드-블랙 트리키 정렬불가불가O(log n)O(log n)
unordered_map해시 테이블무순불가불가O(1)O(1)

242. 유효한 애너그램

두 문자열이 서로의 애너그램인지 판별하세요. 애너그램은 문자 재배열로 다른 단어를 형성하는 관계입니다.

class Solution {
public:
    bool isAnagram(string s, string t) {
        int freqMap[26] = {0};
        for (char ch : s) freqMap[ch - 'a']++;
        for (char ch : t) freqMap[ch - 'a']--;
        for (int count : freqMap) 
            if (count != 0) return false;
        return true;
    }
};

349. 두 배열의 교집합

두 정수 배열에서 공통 요소를 찾아 반환하세요. 결과는 중복이 없어야 합니다.

class Solution {
public:
    vector<int> intersection(vector<int>& numsA, vector<int>& numsB) {
        unordered_set<int> uniqueNums(numsA.begin(), numsA.end());
        unordered_set<int> common;
        for (int val : numsB) 
            if (uniqueNums.count(val)) common.insert(val);
        return vector<int>(common.begin(), common.end());
    }
};

202. 행복한 수

숫자의 각 자릿수 제곱합을 반복하여 1이 되면 행복한 수입니다. 무한 루프 발생 시 false를 반환하세요.

class Solution {
public:
    int digitSquareSum(int n) {
        int total = 0;
        while (n) {
            int remainder = n % 10;
            total += remainder * remainder;
            n /= 10;
        }
        return total;
    }
    
    bool isHappy(int n) {
        unordered_set<int> visited;
        while (n != 1) {
            if (visited.count(n)) return false;
            visited.insert(n);
            n = digitSquareSum(n);
        }
        return true;
    }
};

1. 두 수의 합

배열에서 두 수의 합이 타겟이 되는 인덱스 쌍을 찾으세요.

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> numIndexMap;
        for (int i = 0; i < nums.size(); i++) {
            int complement = target - nums[i];
            if (numIndexMap.count(complement)) 
                return {numIndexMap[complement], i};
            numIndexMap[nums[i]] = i;
        }
        return {};
    }
};

태그: 해시테이블 unordered_set unordered_map 빈도계산 집합연산

6월 8일 04:10에 게시됨