아스키코드에 관해서는 예전에 CRLF 문제 해결에서 잠깐 알아본 적이 있다.
백준 알고리즘 15829. 해시 문제를 풀면서 기록하기 위해 작성하게 되었다.
백준 알고리즘 2744. 대소문자 바꾸기도 아스키 코드로 변경하여 문제를 해결했다.
ASCII (American Standard Code for Information Interchange, 미국 정보 교환 표준 부호)로 1963년 미국 ANSI에서 표준화한 정보교환용 7비트 부호체계이다.
000(0x00)
부터127(0x7F)
까지 총 128개의 부호가 사용된다.
10진수 | 부호 | 10진수 | 부호 | 10진수 | 부호 | 10진수 | 부호 |
---|---|---|---|---|---|---|---|
032 | 056 | 8 | 080 | P | 104 | h | |
033 | ! | 057 | 9 | 081 | Q | 105 | i |
034 | " | 058 | : | 082 | R | 106 | j |
035 | # | 059 | ; | 083 | S | 107 | k |
036 | $ | 060 | < | 084 | T | 108 | l |
037 | % | 061 | = | 085 | U | 109 | m |
038 | & | 062 | > | 086 | V | 110 | n |
039 | ' | 063 | ? | 087 | W | 111 | o |
040 | ( | 064 | @ | 088 | X | 112 | p |
041 | ) | 065 | A | 089 | Y | 113 | q |
042 | * | 066 | B | 090 | Z | 114 | r |
043 | + | 067 | C | 091 | [ | 115 | s |
044 | , | 068 | D | 092 | \ | 116 | t |
045 | - | 069 | E | 093 | ] | 117 | u |
046 | . | 070 | F | 094 | ^ | 118 | v |
047 | / | 071 | G | 095 | _ | 119 | w |
048 | 0 | 072 | H | 096 | ` | 120 | x |
049 | 1 | 073 | I | 097 | a | 121 | y |
050 | 2 | 074 | J | 098 | b | 122 | z |
051 | 3 | 075 | K | 099 | c | 123 | { |
052 | 4 | 076 | L | 100 | d | 124 | | |
053 | 5 | 077 | M | 101 | e | 125 | } |
054 | 6 | 078 | N | 102 | f | 126 | ~ |
055 | 7 | 079 | O | 103 | g |
let char = 'a'
char.charCodeAt() // 97
let ascii = 98
String.fromCharCode(ascii) // 'b'
const path = __dirname + '/input_boj.txt'
// const path = '/dev/stdin'
const input = require('fs').readFileSync(path).toString().trim().split('\n')
let size = +input[0]
let array = input[1].split('')
function makeHash (arr) {
// M과 r은 서로소인 숫자로 M은 1234567891,
// r은 자릿수(항)마다 31을 거듭제곱한 수.
let M = 1234567891
let r = 1
// 값을 누적해 최종적으로 반환할 해시 변수.
let hash = 0
for (let i = 0; i < size; i++) {
// 아스키코드로 변환했을 때 a부터 1로 계산하기 위해 -96
hash += (arr[i].charCodeAt() - 96) * r
// 자리수마다 31을 거듭제곱하기 때문에 곱해줌.
r *= 31
// r이 M값을 넘지 않도록 나머지를 다시 저장
r %= M
// 최종 hash 값 역시 M값을 넘지 않도록 나머지를 저장
hash %= M
}
return hash
}
console.log(makeHash(array))
// 입력 > WrongAnswer
const path = __dirname + '/input_boj1.txt'
// const path = '/dev/stdin'
const input = require('fs').readFileSync(path).toString().trim().split('')
let answer = input.map(el => {
if (el.charCodeAt() > 91) return el.toUpperCase()
else return el.toLowerCase()
}).join('')
console.log(answer) // wRONGaNSWER