MUKER_DEV with iOS

[swift] λ°±μ€€ - 15829번: Hashing λ³Έλ¬Έ

πŸ€– μ•Œκ³ λ¦¬μ¦˜/BAEKJOON

[swift] λ°±μ€€ - 15829번: Hashing

MUKER 2023. 2. 2. 17:18
 

15829번: Hashing

APC에 온 것을 ν™˜μ˜ν•œλ‹€. λ§Œμ•½ μ—¬λŸ¬λΆ„μ΄ ν•™κ΅μ—μ„œ 자료ꡬ쑰λ₯Ό μˆ˜κ°•ν–ˆλ‹€λ©΄ ν•΄μ‹œ ν•¨μˆ˜μ— λŒ€ν•΄ 배웠을 것이닀. ν•΄μ‹œ ν•¨μˆ˜λž€ μž„μ˜μ˜ 길이의 μž…λ ₯을 λ°›μ•„μ„œ κ³ μ •λœ 길이의 좜λ ₯을 λ‚΄λ³΄λ‚΄λŠ” ν•¨μˆ˜λ‘œ μ •

www.acmicpc.net

문제 ν‘ΈλŠ” 데 μžˆμ–΄ 도움이 λ˜λ„λ‘ λ‚˜μ˜ 풀이와 κ°œμ„ λœ 풀이λ₯Ό μ˜¬λ¦½λ‹ˆλ‹€.
λ˜ν•œ 풀이 ν›„ λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이λ₯Ό 보고 μ°Έκ³ ν• λ§Œν•œ 풀이도 μ˜¬λ¦½λ‹ˆλ‹€.

- λ¬Έμ œμ— 따라 λ‚˜μ˜ ν’€μ΄λ§Œ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
- ν•΄λ‹Ή 풀이듀은 풀이 쀑 ν•˜λ‚˜μΌ 뿐 μ΅œμ„ μ˜ ν’€μ΄λŠ” 아닐 수 μžˆμŠ΅λ‹ˆλ‹€.

 


 

문제 μ„€λͺ…

 

ν•΄λ‹Ή λ¬Έμ œμ— 주어진 λ¬Έμžμ—΄μ„ ν•΄μ‹œκ°’μœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•΄

λͺ¨λ“ˆλ‘œ μ—°μ‚°μ˜ 속성을 μ΄μš©ν•΄ ν’€ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

λͺ¨λ“ˆλ‘œ 연산은 저희가 λ§Žμ΄μ“°λŠ” '%'둜

λ‚˜λˆ„μ–΄ λ–¨μ–΄μ‘Œμ„ λ•Œ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜λŠ”κ±Έ λ§ν•˜λŠ”λ°μš”.

 

ν•΄λ‹Ή λ¬Έμ œμ—μ„œ λͺ¨λ“ˆλ‘œ μ—°μ‚°μ˜ 속성 쀑

(a * b) mod n = {(a mod n) * (b mod n)} mod n

λ₯Ό λͺ¨λ₯΄λ©΄ λΆ€λΆ„μ μˆ˜ 50점이 λ‚˜μ™”κ³ 

ν•΄λ‹Ή 속성을 μ μš©ν•΄μ„œ ν‘Έλ‹ˆ 100점이 λ‚˜μ™”μŠ΅λ‹ˆλ‹€.

 

κ·Έλƒ₯ ν’€λ©΄ λ¬Έμžμ—΄κΈΈμ΄κ°€ λ„ˆλ¬΄ κΈΈμ–΄ μ΄ˆκ³Όλ˜λ‚˜ λ΄…λ‹ˆλ‹€.

 


 

λ‚˜μ˜ 풀이(μ˜€λ‹΅)

import Foundation

let _ = Int(readLine()!)!
var a = readLine()!.utf8.map { Int($0) - 96 }
var result = 0
for i in a.enumerated() {
    result += i.element * Int(pow(31.0, Double(i.offset)))
}
print(result)

 

ν•΄λ‹Ή ν’€μ΄λŠ” powν•¨μˆ˜μ—μ„œ μ œκ³±μˆ˜κ°€ λ„ˆλ¬΄ μ»€μ Έμ„œ λΆ€λΆ„μ μˆ˜λ§Œ λ‚˜μ™”μŠ΅λ‹ˆλ‹€.

 


 

κ°œμ„ λœ 풀이

_ = readLine()
let str = readLine()!.map{ Int($0.asciiValue!) - 96 }
let mod = 1234567891
var (hash, m) = (0, 1)

for i in str {
    hash = (hash + i*m) % mod
    m = (m*31) % mod
}

print(hash)

 

λͺ¨λ“ˆλ‘œ μ—°μ‚°μ˜ νŠΉμ„±λ•μ—

hash값에도 % mod ν•˜κ³ 

m값에도 % modλ₯Ό ν•˜μ—¬ κ³„μ‚°ν–ˆμŠ΅λ‹ˆλ‹€.