반응형
백준 15829번 문제 Hashing 해싱
50점 풀이와 100점 풀이가 있는 문제이다. 둘 다 적겠다
https://www.acmicpc.net/problem/15829
100점 문제 풀이
알파벳을 의미하는 숫자 반환 함수 - 유니코드 활용 ord()
입력된 알파벳을 숫자로 만들고 해시값 계산
100점 해답 코드 Python
#백준 15829 Hashing - 100점
from sys import stdin
#데이터 입력
L = int(stdin.readline())
data = stdin.readline().rstrip()
sum = 0
r = 31
n = [0]*L
M = 1234567891
#알파벳을 의미하는 숫자 반환 함수 - 유니코드 활용
def alToNum(data) :
for i in range(L) :
cal = ord(data[i]) - ord('a') + 1
#print(data[i], "의 숫자 ", cal)
n[i] = cal
alToNum(data)
#알파벳 배열을 숫자로 만들고 해시값 계산
for j in range(len(data)) :
ri = r**j
sum += n[j]*ri
#print(j, " sum : ", sum)
print(sum % M)
50점 문제 풀이
100점 풀이와 동일하지만 유니코드 값을 사용하지 않고
직접 알파벳 전체 배열을 만들어서 반복문으로 동일한 거 찾음
50점 해답 코드 Python
#백준 15829 Hashing - 50점
from sys import stdin
#데이터 입력
L = int(stdin.readline())
data = stdin.readline().rstrip()
sum = 0
r = 31
n = [0]*L
M = 1234567891 #-> ??
#알파벳을 의미하는 숫자 반환 함수
def alToNum(data) :
alph = ['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']
for j in range(L) :
for i in range(len(alph)) :
#print(a + ", " + alph[i])
if(data[j] == alph[i]) :
#print(i, " 찾았다 : ", i+1)
n[j] = i+1
break
alToNum(data)
#알파벳 배열을 숫자로 만들고 해시값 계산
for j in range(len(data)) :
ri = r**j
sum += n[j]*ri
#print(j, " sum : ", sum)
print(sum % M)
Comment
- 파이썬은 함수에서 값을 반환할 때 하나의 변수를 반환하는 것이 아니면 반환 자료형이 NoneType이 된다. 가능한 return문에서 연산을 하지 말고 반환할 값을 임시로 변수에 한 번 저장하고 해당 변수를 return하자.
- stdin.readline().rstrip() : stdin.readline()로 입력받으면 해당 줄의 마지막 개행문자까지 포함하므로 실제 데이터 길이에 +1됨. int등으로 형번횐하면 괜찮겠지만 항상 .strip()을 붙이는 습관 들일 것
- 귀찮아하지 말고 시간 단축 생각하기 - 유니코드 활용 처음에 떠올렸지만 찾아서 써보려 하지 않았음!
- ord() : 문자의 유니코드 반환 함수
반응형
'DSA > Algorithm' 카테고리의 다른 글
[백준 2231] 분해합 Python 완전탐색(브루트포스) (0) | 2021.09.26 |
---|---|
[백준 2798] 블랙잭 Python 완전탐색(브루트포스) (0) | 2021.09.26 |
[백준 12605] 단어순서 뒤집기 Python 스택 (0) | 2021.09.14 |
[백준 2161] 카드1 Python 큐 (0) | 2021.09.14 |
[백준 17608] 막대기 Python 스택 (0) | 2021.09.14 |