Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- REST_API
- 코드스테이츠
- useState
- 큐
- 회고
- 백준
- javascript
- Til
- level1
- html
- 프로토타입
- 30daysdowoonchallenge
- 자료구조
- mysemester
- superstarjypnation
- UX
- 카카오
- 자바스크립트
- 운영체제
- UI
- vercel
- 스택
- React
- 해시테이블
- 생활코딩
- 프로그래머스
- Next.js
- redux
- web
- CSS
Archives
- Today
- Total
데굴데굴
[파이썬] 15829번: Hashing 본문
처음엔 딕셔너리로 풀어서 제출했다가 다른 사람들의 코드가 유난히 짧은 것을 보고 의문이 생겨 찾아보니 아스키코드로 푸는 방법이 있는 것을 알았다.
딕셔너리로 풀기
# Hashing - 딕셔너리로 풀기
m = 1234567891
r = 31
alpha = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
num = {}
for i in range(len(alpha)):
num[alpha[i]] = i + 1
L = int(input())
str = input()
def hash_mod(s):
seq = 0
for j in range(len(s)):
seq += num[s[j]] * (r ** j)
res = seq % m
return res
print(hash_mod(str))
리스트에 알파벳을 하나씩 담아놓은 후 딕셔너리 'num'에 for 반복문을 이용하여 각 알파벳에 숫자를 마킹했다.
num = {'a':1, 'b':2 ·····} <- 이런 식으로 말이다.
새로운 함수 hash_mod
를 만들어 문제에서 제시한 해시함수를 구현했다.
아스키코드로 풀기
# Hashing - 아스키코드 활용
L = int(input())
str = input()
res = 0
for i in range(L):
res += (ord(str[i]) - 96) * (31 ** i)
res = res % 1234567891
print(res)
소문자 알파벳의 아스키코드는 'a' = 97부터 시작한다. 따라서 각 문자의 아스키코드에서 96씩을 빼주면 딕셔너리를 만들 필요없이 간단하게 알파벳을 숫자에 매핑할 수 있다.
나는 수학 알러지가 있는 사람이라 문제가 너무 길거나 수학 기호가 등장하면 지레 겁먹는 편인데 막상 풀어보니 생각보다 그렇게 어렵지는 않았다. 해시 함수의 개념을 알고 있었기 때문인 것 같기도 하다. 해시를 배울 때에는 해시 함수를 직접 구현해볼 생각은 못했었는데 문제를 통해 간단하게나마 구현해볼 수 있어서 좋았다. 컴공 기초과목의 중요성을 다시금 느낄 수 있었던 문제이다.
'algorithm > 백준' 카테고리의 다른 글
[파이썬] 1966번: 프린터 큐 (0) | 2022.08.11 |
---|---|
[파이썬] 11050번: 이항 계수 1 (0) | 2022.08.07 |
[파이썬] 2164번: 카드2 (0) | 2022.08.05 |
[파이썬] 4153번: 직각삼각형 (0) | 2022.07.26 |
[파이썬] 11655번: ROT13 (0) | 2022.07.22 |
Comments