해시 문제 목록 링크 / 문제 링크 / Github 링크 |
---|
import Foundation
func solution(_ clothes:[[String]]) -> Int {
return 0
}
import Foundation
func solution(_ clothes: [[String]]) -> Int {
var clothesCategorized: [String:[String]] = [:]
for i in clothes.indices {
var items = clothesCategorized[clothes[i][1], default: []]
items.append(clothes[i][0])
clothesCategorized[clothes[i][1]] = items
}
let combinationCount = clothesCategorized
.map({ $0.value.count })
.map({ $0 + 1 })
.reduce(1, *)
return combinationCount - 1
}
map
사용 최소화: map
은 새로운 배열을 생성하므로, 불필요한 메모리 사용과 연산을 줄이기 위해 다른 방법을 사용할 수 있음import Foundation
func solution(_ clothes: [[String]]) -> Int {
var clothesCountByCategory: [String: Int] = [:]
for cloth in clothes {
let category = cloth[1]
clothesCountByCategory[category, default: 0] += 1
}
let totalCombinations = clothesCountByCategory.values.reduce(1) { $0 * ($1 + 1) }
return totalCombinations - 1
}
map
에 의해 생성되는 중간 배열과 불필요한 문자열 배열을 제거해 메모리 사용량이 줄어듬Hash는 데이터를 특정한 규칙에 따라 고정된 길이의 값(해시값)으로 변환하는 방법 또는 그 결과를 의미한다. 이를 수행하는 함수는 해시 함수(Hash Function)라고 한다.
고정된 길이 출력
입력 데이터의 크기와 관계없이 항상 고정된 길이의 해시값을 생성한다. 예를 들어, SHA-256
해시 함수는 256비트 길이의 해시값을 반환한다.
단방향성
해시 함수는 단방향 함수이다. 즉, 해시값으로부터 원래 데이터를 역으로 추정하는 것이 거의 불가능하다.
고유성(충돌 회피)
서로 다른 입력 데이터는 거의 항상 서로 다른 해시값을 생성한다. 같은 해시값이 발생하는 경우를 해시 충돌(Hash Collision)이라고 하며, 좋은 해시 함수는 이러한 충돌 가능성을 최소화한다.
빠른 계산
해시 함수는 입력 데이터에 대해 빠르게 해시값을 계산할 수 있어야 한다.
데이터 무결성 확인
파일의 해시값을 비교하여 데이터가 변조되지 않았는지 확인할 수 있다.
예: 다운로드한 파일의 무결성 검증
비밀번호 저장
비밀번호를 해시값으로 변환하여 데이터베이스에 저장함으로써 원본 비밀번호를 알 수 없도록 보호한다.
데이터 검색
해시 테이블(Hash Table)은 데이터를 빠르게 검색하기 위해 해시를 사용한다.
디지털 서명 및 인증
데이터를 암호화하고 인증하는 데 사용된다.
import CryptoKit
let input = "Hello, world!"
let inputData = Data(input.utf8)
let hashed = SHA256.hash(data: inputData)
// 해시값 출력
let hashString = hashed.compactMap { String(format: "%02x", $0) }.joined()
print(hashString) // 315f7c46e2b9b1ef99ef7c2f74c35d7a4f1dbcc8a0a2b78da8c3ad9ab8c21445
해시 알고리즘은 보안성이나 속도에 따라 여러 종류가 있으며, 다음과 같은 알고리즘들이 자주 사용된다.
Key-Value 연산은 Hash와 깊은 관련이 있으며, 특히 데이터를 빠르게 저장하고 검색하는 데 중요한 역할을 한다. 이 방식은 주로 해시 테이블(Hash Table)이라는 자료구조에서 사용된다.
Key-Value 구조에서는 Key를 입력으로 받아 그에 대응하는 Value를 저장하거나 검색한다. 이때, Key를 빠르게 검색하기 위해 해시 함수를 사용한다.
var dictionary: [String: Int] = ["apple": 3, "banana": 5]
print(dictionary["apple"]!) // 3
// 여기서 Key인 `"apple"`은 해시 함수로 처리되어 Value인 `3`에 빠르게 접근한다.