<문제>

https://www.acmicpc.net/problem/15829

 

<풀이>

import sys

input = sys.stdin.read().splitlines()

def solve(input):
    L = int(input[0])
    string = input[1]

    dict = {}
    temp_list = ['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']

    sum = 0

    for i, char in enumerate(temp_list):
        dict[char] = i+1

    for i, char in enumerate(string):
        sum += dict[char] * 31**i

    return sum % 1234567891

print(solve(input))

 

- 알파벳과 숫자를 묶은 딕셔너리 준비

- 전체 sum에다 1234567891를 나눈 나머지를 구하면 됨

 

 

<node 풀이>

const fs = require("fs");
const [L, str] = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `5
zzzzzzz`
)
  .trim()
  .split('\n')

const l = Number(L)
const arr = str.split('')

const aMap = {
  'a': 1,
  'b': 2,
  'c': 3,
  'd': 4,
  'e': 5,
  'f': 6,
  'g': 7,
  'h': 8,
  'i': 9,
  'j': 10,
  'k': 11,
  'l': 12,
  'm': 13,
  'n': 14,
  'o': 15,
  'p': 16,
  'q': 17,
  'r': 18,
  's': 19,
  't': 20,
  'u': 21,
  'v': 22,
  'w': 23,
  'x': 24,
  'y': 25,
  'z': 26
};

let hash = 0;
let r = 1
for (let i = 0; i < arr.length; i++) {
  hash += aMap[arr[i]] * r
  hash %= 1234567891
  r *= 31
  r %= 1234567891
}

console.log(hash)

 

- 자바스크립트의 Number 타입은 64비트 부동소수점 형식 사용, 2^53-1을 넘어가는 정수는 오차 발생가능성 있음

- 그래서 BigInt 타입을 이용하던지

- 아님 계산을 쪼개서 나누던지 (중간에 모듈러 연산)

'TIL > [파이썬] 1일 1코테' 카테고리의 다른 글

전주 듣고 노래 맞히기_백준31562  (0) 2025.01.23
아 맞다 마늘_백준32978  (0) 2025.01.22
할리갈리_백준27160  (0) 2025.01.20
전화번호 목록_프로그래머스  (0) 2025.01.20
세로읽기_백준10798  (0) 2025.01.18

+ Recent posts