한글로 작성된 기술적 내용은 다음과 같습니다.
1. 해시 테이블의 기본 개념
해시 테이블은 데이터 구조 중 하나로, 주어진 키 값에 따라 데이터를 직접 접근할 수 있도록 합니다.
- 정의: 배열과 유사하게 동작하며, 인덱스를 통해 데이터에 접근합니다. 그러나 해시 테이블에서는 특정 함수(해시 함수)가 입력값을 변환하여 저장 위치를 결정합니다.
- 해시 충돌: 서로 다른 두 개 이상의 키가 동일한 해시 값을 가질 때 발생합니다. 이를 해결하기 위해 체인법 또는 선형 탐사법을 사용합니다.
주요 해시 구조
실제 프로그래밍에서 자주 사용되는 세 가지 주요 해시 구조는 다음과 같습니다:
- 배열: 고정된 범위 내의 데이터를 효율적으로 처리할 때 사용됩니다.
- Set: 중복 없는 데이터를 관리하는 데 적합하며, C++에서는 unordered_set을 주로 사용합니다.
- Map: 키-값 쌍으로 데이터를 저장하며, C++에서는 unordered_map을 많이 사용합니다.
2. 문자 이동 문제
문제 설명
두 문자열 s와 t가 주어졌을 때, 각각의 문자가 동일한 횟수만큼 나타나는지 확인하는 문제입니다.
코드 예제
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
for (char c : s.toCharArray()) {
record[c - 'a']++;
}
for (char c : t.toCharArray()) {
record[c - 'a']--;
}
for (int count : record) {
if (count != 0) return false;
}
return true;
}
}
3. 두 배열의 교집합
문제 설명
두 개의 배열 nums1과 nums2가 주어졌을 때, 공통된 요소를 찾아내는 문제입니다.
코드 예제
import java.util.HashSet;
import java.util.Set;
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>();
Set<Integer> resSet = new HashSet<>();
for (int i : nums1) {
set1.add(i);
}
for (int i : nums2) {
if (set1.contains(i)) {
resSet.add(i);
}
}
return resSet.stream().mapToInt(x -> x).toArray();
}
}
4. 행복한 수 찾기
문제 설명
숫자 n이 주어졌을 때, 각 자리 숫자의 제곱 합을 계속 계산하여 결국 1이 되는지를 판별하는 문제입니다.
코드 예제
class Solution {
public boolean isHappy(int n) {
Set<Integer> record = new HashSet<>();
while (n != 1 && !record.contains(n)) {
record.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n) {
int res = 0;
while (n > 0) {
int temp = n % 10;
res += temp * temp;
n /= 10;
}
return res;
}
}
5. 두 수의 합
문제 설명
배열 nums와 목표값 target이 주어졌을 때, 두 요소의 합이 target이 되는 인덱스를 반환하는 문제입니다.
코드 예제
public int[] twoSum(int[] nums, int target) {
Map map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
return new int[0];
}
6. 네 수의 합 II
문제 설명
네 개의 배열이 주어졌을 때, 각 배열에서 하나씩 요소를 선택하여 그 합이 0이 되는 경우의 수를 구하는 문제입니다.
코드 예제
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map map = new HashMap<>();
for (int a : nums1) {
for (int b : nums2) {
int sum = a + b;
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
}
int count = 0;
for (int c : nums3) {
for (int d : nums4) {
count += map.getOrDefault(-(c + d), 0);
}
}
return count;
}
}
7. 속죄 편지
문제 설명
ransomNote와 magazine이라는 두 개의 문자열이 주어졌을 때, ransomNote를 구성하기 위해 magazine의 문자를 사용할 수 있는지를 확인하는 문제입니다.
코드 예제
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if (ransomNote.length() > magazine.length()) return false;
int[] record = new int[26];
for (char c : magazine.toCharArray()) {
record[c - 'a']++;
}
for (char c : ransomNote.toCharArray()) {
if (--record[c - 'a'] < 0) return false;
}
return true;
}
}
8. 세 수의 합
문제 설명
배열 nums가 주어졌을 때, 세 요소의 합이 0이 되는 모든 조합을 찾는 문제입니다.
코드 예제
class Solution {
public List threeSum(int[] nums) {
List result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) break;
if (i > 0 && nums[i] == nums[i - 1]) continue;
int left = i + 1, right = nums.length - 1;
while (right > left) {
int sum = nums[i] + nums[left] + nums[right];
if (sum > 0) right--;
else if (sum < 0) left++;
else {
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
right--; left++;
}
}
}
return result;
}
}
9. 네 수의 합
문제 설명
배열 nums와 목표값 target이 주어졌을 때, 네 요소의 합이 target이 되는 모든 조합을 찾는 문제입니다.
코드 예제
class Solution {
public List fourSum(int[] nums, int target) {
List result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
for (int j = i + 1; j < nums.length; j++) {
if (j > i + 1 && nums[j] == nums[j - 1]) continue;
int left = j + 1, right = nums.length - 1;
while (right > left) {
long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
if (sum > target) right--;
else if (sum < target) left++;
else {
result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
right--; left++;
}
}
}
}
return result;
}
}