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 | 29 | 30 | 31 |
Tags
- 네이티브애플리케이션
- 루트사용자
- 프로그래머스
- 스레드동기화
- API
- 제너릭메서드
- openapi
- 참조변수타입변환
- 4A피드백
- 프로젝트
- 백준
- SQL
- 날씨API
- API명세서
- 동전교환알고리즘
- staging_area
- Spring
- 성장형마인드셋
- 코딩테스트
- 자바
- ChatGPT
- string메서드
- 파일사용권한
- 배열탐색
- 99클럽
- 향상된for문
- Java
- SQ3R
- 스프링
- 재귀적사고
Archives
- Today
- Total
개발 공부용
[백준] 15829 - Hashing 본문
문제 출처 : https://www.acmicpc.net/problem/15829\
문제 정리
입력으로 들어오는 문자열은 영문 소문자로만 구성되어 있음.알파벳 a~z는 1~26의 고유한 번호로 치환할 수 있음.따라서 문자열을 수열로 변환할 수 있음. e.g)abba->1,2,2,1해시값을 계산하기 위해서 문자열, 즉 수열을 하나의 정수로 치환할 것임.수열을 모두 더하고 M으로 나눌 것임.수열의 각 항의 번호에 해당 하는 만큼 특정한 숫자를 거듭제곱해서 곱해준 다음 더함.특정한 숫자 r은 31이며 M은 1234567891임.
입력
첫 줄에는 문자열의 길이 L이 들어온다.
둘째 줄에는 영문 소문자로 이루어진 문자열이 들어온다.
출력
문자열을 해시값으로 계산하여 정수로 출력한다.
풀이 방법
- 문자열을 한글자씩 읽으면서 아스키코드로 변환하고 96을 빼서 1~26의 수로 치환한다.
- for문 돌면서 계산한다.
작성한 코드
import sys
L = int(sys.stdin.readline().strip())
string = sys.stdin.readline().strip()
result = 0
for i in range(L):
number = ord(string[i])-96
result+=number*pow(31,i)
print(result%1234567891)
알파벳 순서대로 숫자로 변환해야 한다는 점을 보고 아스키코드를 활용하면 되겠다는 생각이 바로 들어서 비교적 빨리 풀었다.
처음에는 숫자를 변환하고 이를 리스트에 저장하는 for문과 계산하는 for문을 각각 작성해서 풀었는데
사실 그럴 필요 없이 숫자를 변환한 뒤 바로 계산하면 되어서 코드를 개선했다.
'코딩 테스트 > 99클럽 TIL' 카테고리의 다른 글
[백준] 31562 - 전주 듣고 노래 맞히기 (0) | 2025.01.24 |
---|---|
[백준] 32978 - 아 맞다 마늘 (2) | 2025.01.23 |
[백준] 27160 - 할리갈리 (0) | 2025.01.20 |
[백준] 10798 - 세로읽기 (0) | 2025.01.18 |
[백준] 11945 - 뜨거운 붕어빵 (0) | 2025.01.17 |