๋ฌธ์
https://www.acmicpc.net/problem/15829
ํ์ด
ํด์ฑ ์นดํ ๊ณ ๋ฆฌ ๋ฌธ์ ์ค ๊ฐ์ฅ ๋ฎ์ ๋์ด๋์ ๋ฌธ์ ๋ค.
๋ฌธ์ ์ ์ ํ์๋ ์์ ๊ทธ๋๋ก ์ฝ๋๋ก ๋ณํํ์ฌ ๊ตฌํํ๊ธฐ๋ง ํ๋ฉด๋๋ค.
๊ทธ๋์ ์ฒ์์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ ์ถํ๋ค.
1์ฐจ์๋
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
final int r = 31, m = 1234567891;
int res = 0,l = Integer.parseInt(scan.nextLine());
String str = scan.nextLine();
for(int i=0; i<l; i+=1){
int character = str.charAt(i) - 'a' + 1;
res += character*(int)(Math.pow(r,i))%m;
}
System.out.println(res);
}
}
๋จ์ ๋ฐ๋ณต๋ฌธ์ ํ์ฉํ์ฌ ์๊ทธ๋ง ํฉ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋๋ก ์ฝ๋๋ฅผ ๊ตฌํํ์๋ค.
50์ ์ด ๋์๋ค. ๋ฌธ์์ด ๊ธธ์ด L์ด 1โคLโค5 ์ฌ์ด๋ก ์ ๋ ฅ๋์์๋๋ ์ ๋๋ก ๋์ํ๋, 1โคLโค50์ ์๋์ ์ผ๋ก ํฐ๊ฐ์ด ๋ค์ด์์๋๋ ์ ์์ ์ธ ๊ฐ์ด ์ถ๋ ฅ๋์ง ์์๋ค๋ ๊ฒ์ด๋ค.
์์ธ์ ์ฐพ๋์ค ๋ฐฑ์ค ์ง๋ฌธ๊ฒ์ํ์์ ์๋์ ๊ฐ์ ๋ด์ฉ์ ๋ต๋ณ์ ๋ฐ๊ฒฌํ๋ค.
์๋ฐ ๊ธฐ์ค Math.pow() ๋งค์๋๋ ๋ถ๋์์์ ์ฐ์ฐ์ ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์ ๊ฐ์ด ํด์๋ก ๋ถ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ ์๋ค.
๋ถ๋ ์์์ ์ฐ์ฐ?
์ผ๋จ ๋จผ์ ๋ถ๋ ์์์ ์ฐ์ฐ์ ๋ํด์ ์ดํดํ๊ธฐ ์ํด์๋ ๊ณ ์ ์์์ ๊ณผ ๋ถ๋ ์์์ ์ ๋ํ ๊ฐ๋ ์ ์ดํด๊ฐ ํ์ํ๋ค.
๋จผ์ 10์ง์ ์์๋ 2์ง์๋ก ๋ณํํ ์ ์๋๋ฐ ์๋ฅผ ๋ค์ด 0.5๋ฅผ 2์ง์ ์์๋ก ํํํ๋ฉด 0.5๋ \(2^{-1}\) ์ด๋ฏ๋ก 0.1์ด ๋๋ค. ๋ ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก 0.25๋ \(2^{-2}\) ์ด๋ฏ๋ก 0.01์ด ๋๋ค. ๊ทธ๋ผ ๋ง์ฝ์ 0.6์ ์์๋ก ํํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
0.10011001100110011001100110011001100110011001100110011โฆ.
๋๋ ์์ด ์ด์ด์ง๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ๊ณ ์ ์์์ ์ด๋ ๋ถ๋์์์ ์ด๋์ ๋ฐ๋ผ์ ์์์ ํํ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค.
- ๊ณ ์ ์์์
์ ์, ์์๋ฅผ ํํํ ์ ์๋ ๋นํธ์ ๊ฐฏ์์ ์ ํ์ด ์๋ ๋ฐฉ๋ฒ์ด๋ค. ์๋ฅผ๋ค์ด ์์ ๊ฐ์ ์์๋ฅผ ๋ณ์์ ๋ฃ๋๋ค๊ณ ํ ๋ ๋ง์ฝ ํด๋น ๋ณ์์ ์๋ฃํ์์ ์ค์์ ํํ ๋นํธ๊ฐ 15bit๊ฐ ์ ํ์ด ์๋ค๊ณ ํ๋ฉด 0.6์ 0.100110011001100 ๊น์ง๋ง ์ ์ฅ์ด ๋ ๊ฒ์ด๋ค. ์ด๋ฐ๊ฒฝ์ฐ ๋น์ฐํ ๋ค๋ถ๋ถ์ด ์๋ ค๋ฒ๋ ธ์ผ๋ ์ด ๋ณ์์ ์๋ ์๋ ๋ณ๋ค๋ฅธ ๋ณด์ ์์ ์ด ์๋ค๋ฉด ์ ํํ 0.6์ ๊ฐ๋ฆฌํค์ง ๋ชปํ๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๊ณ ์ค์๋ฅผ ๋ํ๋ด๋๋ฐ ์ฌ์ฉํ๋ ๋นํธ์ ์์ ๋๋ฆฌ๊ธฐ์๋ ํ์ ๋ ๊ณต๊ฐ์์ ์ ์๋ฅผ ๋ํ๋ด๋ ๋นํธ๋ง์ ์ค์ด ์ด๋ป๊ฒ ํด๋ ์ ํํ ์์ ํํ์ด ์ด๋ ค์์ง๋ค. ์ด๋ฌํ ์ ์ฝ์ผ๋ก ์ธํด ํ์ฉํ๋ ๋ฐฉ์์ด ๋ถ๋ ์์์ ์ด๋ค.
- ๋ถ๋ ์์์
๋ถ๋ ์์์ ํํ์ ์ค์ ๋ถ๋ถ์ ๋ ๋ง์ด ๋ณด์กดํ๊ธฐ ์ํด์ ์ ์๋ถ๋ถ์ ๊ทธ๋๋ก ์ ์ฅํ๋ ๊ฒ์ด ์๋ ์ต๋ํ ๋จ์ํ ์ํจ๋ค. ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋จ์ํ๋ฅผ ์ํจ๋ค. (IEEE 754 ํ์ค ๊ธฐ์ค)
- ๋จผ์ ๋ถํธ๋นํธ๋ฅผ ์ค์ (์์ = 0 , ์์ = 1)
- ์ ์๋ถ๊ฐ 0์ด ์๋๋ผ๋ฉด ์์์ ์ ์ข์ธก์ผ๋ก ์ด๋์์ผ 1.xxx ํํ๊ฐ ๋์ค๊ฒ ๋ง๋ ๋ค. 0์ด๋ผ๋ฉด ์ฐ์ธก์ผ๋ก ์ด๋์์ผ 1.xxx ํํ๊ฐ ๋์ค๊ฒ ๋ง๋ ๋ค.
- ์์์ ์ ์ฎ๊ธฐ๊ธฐ์ ์์์ 2๋ฅผ ๋ช๋ฒ ๊ณฑํด์ผ ํด๋น์๊ฐ ๋์ค๋์ง ๊ณ์ฐ(์์์ ์ ์ฎ๊ธด์์์ ์๋์๋ฅผ ๋๋ด์๋ ๊ฐ)
- ๋ ์์ ์ฐจ์ด์ ๋ํ ๊ฐ์ \(2^n\)ํํ๋ก ํํ๋์ด์ง๋ฉฐ n์ ๊ฐ์ ์ง์ ๋นํธ ๋ถ์ ์ ๋ ฅ
- 1.xxx ํํ๋ก ๋ฐ๊พผ ์์์ ๋๋จธ์ง xxx๋ถ๋ถ์ ๊ฐ์ ๋นํธ ๋ถ๋ถ์ ๋๋ ๋งํผ ์ต๋ํ ์ ๋ ฅ
IEEE 754 ๋ถ๋ ์์์ ํ์ค
[1๋นํธ] [ 8๋นํธ ] [ 23๋นํธ ]
๋ถํธ๋นํธ ์ง์๋นํธ ๊ฐ์ ๋นํธ
์ด ๋ฐฉ๋ฒ์ผ๋ก ๊ณ ์ ์์์ ์ ๋นํด์๋ ์กฐ๊ธ ๋ ์ ํํ ์ค์๋ฅผ ์ ์ฅํ ์ ์๋ค. ํ์ง๋ง ๋ถ๋์์์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ํํ ์์์ ์ ํํํ์ง๋ ๋ชปํ๋ค.
๋ถ๋ ์์์ ์ฐ์ฐ์ ๋ฌธ์ ์
์ค์๋ ์ ํํ๊ฒ ํํ์ด ๋์ง ์๋๋ฐ ๊ณ์ฐ ํ์๋๋ ์ ํํ ๋ต์ด ๋์ค์ง ์์ ์ ์๋ค๋๊ฑด ๋๋ฌด ๋น์ฐํด ๋ณด์ด์ง๋ง ์ ์๋ฅผ ๋ถ๋ ์์์ ์ฐ์ฐ์ ํ์๋ ์ด๋ค๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฑธ๊น?
์๋ฅผ๋ค์ด ์ ์ 37๊ณผ 131์ ์์์ ์ค๋ช ํ ๋ถ๋์์์ ๋ณํ ๋ฐฉ๋ฒ์ ํ์ฉํด ํํํ๋ฉด ์๋์ ๊ฐ๋ค.
[0][1111010][00101] โ 37
[์์][2^5][์ ์๋ถ๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ค์ ๋ถ๋ถ]
[0][1111000][0000011] โ 131
[์์][2^7][์ ์๋ถ๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ค์ ๋ถ๋ถ]
๋ ์๋ฅผ ๋ถ๋ ์์์ ์ฐ์ฐ์ ์ด์ฉํด ๊ณฑํ๋ฉด
[0][1110011][001011101111]
[์์][2^12][์ ์๋ถ๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ค์ ๋ถ๋ถ]
์์ ๊ฐ์ด ๋์ค๊ณ ๋ค์ ์ ์๋ก ์ ํํ๋ฉด 4847์ด๋ผ๋ ๊ฐ์ด ์ ์์ ์ผ๋ก ๋์จ๋ค. ์ฌ๊ธฐ๊น์ง๋ ๋ฌธ์ ๊ฐ ์๋ค.
๋ฌธ์ ๋ ์ฐ์ฐ๊ฒฐ๊ณผ๊ฐ ๊ฐ์๋นํธ๋ฅผ ์ด๊ณผํ๋ ๊ฐ์ด ๋์ค๋ฉด ๊ทธ๋๋ถํฐ ๋ฌธ์ ๊ฐ ๋๊ธฐ ์์ํ๋ค.
์๋ฅผ๋ค์ด 480,730๊ณผ 269,602๋ฅผ ๊ณฑํ๋ค๊ณ ํด๋ณด์
480,730 = 1.110101010111011010 _ 2^18 = [0][1101101][110101010111011010]
269,602 = 1.000001110100100010 _ 2^18 = [0][1101101][000001110100100010]
์๋ ๋์์ผ๋๋ ์ ๋๋ก ๋ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
129,605,769,460 = 1.111000101101000110110001100011110100 * 2^36
๊ทธ๋ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๊ฐ์๋นํธ๊ฐ ์ด 36๊ฐ๊ฐ ๋ค์ด๊ฐ์ผ๋๋๋ฐ IEEE 754 ํ์ค์ ๋ฐ๋ฅด๋ฉด ๊ฐ์๋นํธ๋ 23๋นํธ๊น์ง๋ง ๋ค์ด๊ฐ์ ์๋ค.
์ด๋ก์ธํด ๊ฐ์๋นํธ 32๋นํธ์ค 23๋นํธ๊น์ง๋ง ์ ๋ ฅ์ด ๋์ด์ง๊ณ ๋๋จธ์ง 13๋นํธ๋ ์๋ฉธ๋์ด์ง๋ค. ์ด๋ก์ธํด ์ค์ ๋ก ์ ์ฅ๋๋ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
15,821,016 = 1.11100010110100011011000 * 2^23 = [0][1101000][11100010110100011011000]
๋ฐ๋ผ์ ์๋ \(480730\times 269602 = 129605769460\) ์ด์ฌ์ผ ํ์ง๋ง ์ ์ ๋ถ๋์์์ ์ฐ์ฐ์ ์ด์ฉํ๋ค๋ฉด \(480730\times 269602 = 15821016\) ๊ฐ ๋์ด๋ฒ๋ฆฐ๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์๋ฐ ๋ด๋ถ ๋งค์๋ ์ค Math.pow() ํจ์๋ ๋ถ๋ ์์์ ์ฐ์ฐ์ ์งํํ๊ณ ๊ฐ์ด ์ปค์ง ์๋ก ๋ถ์ ํํ ๊ฐ์ ์ถ๋ ฅํ ์ ์๊ธฐ๋๋ฌธ์ 1โคLโค50 ์ผ๋ ์ ์์ ์ผ๋ก ๋์ํ์ง ๋ชปํ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ Math.pow()๋ฅผ ๋์ฒดํ ๋งํ ๋ถ๋ ์์์ ์ฐ์ฐ์ ํ์ง ์๋ ๋ค๋ฅธ ๋งค์๋๋ฅผ ํ์ฉํ๊ฑฐ๋ ์ง์ ๋ง๋ค์ด์ผํ๋ค.
๊ทธ๋์ ๋๋ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด ์ผ์ผํ ๊ณฑ์ ์ ์งํํด Math.pow() ๋งค์๋๋ฅผ ๋์ฒดํ๋ ๋งค์๋๋ฅผ ๋ง๋ค์๊ณ ์์ ํ์ฌ ์ ์ถํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
import java.util.Scanner;
public class Main
{
//Math.pow()ํจ์๋ฅผ ๋์ฒด
static long power(int r, int x) {
long res = 1;
for(int i=0; i<x; i+=1) res *= r;
return res;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
final int r = 31, m = 1234567891;
int l = Integer.parseInt(scan.nextLine());
// int ๋์ long ์๋ฃํ ํ์ฉ
long res = 0;
String str = scan.nextLine();
for(int i=0; i<l; i+=1){
int character = str.charAt(i) - 'a' + 1;
res += character*power(r,i)%m;
}
System.out.println(res);
}
}
๋์ฒด ๋งค์๋๋ฅผ ๋ง๋ค๊ณ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด ์๊ทธ๋ง ํฉ์ ๊ณ์ฐํ๋ฉด์ ๋์ ๋๋ ๊ฐ์ด int ๋ฒ์๋ฅผ ์ด๊ณผํ ๊ฒ ๊ฐ์ ๋ ํฐ ์ ์ ์๋ฃํ์ธ long ์ ํ์ฉํ์๋ค.
์๋ฃํ ๋น๊ต
int โ -2,147,483,648 ~ 2,147,483,647
long โ -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
2์ฐจ์๋ ๊ฒฐ๊ณผ
์ฌ์ ํ ํฐ์๋ฅผ ๋ฃ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ๋ค.
long๋ณด๋ค ๋ ํฐ ์๋ฃํ์ด ์๋ฐ์ ํน์๋ ์๋์ง ์ฐพ์๋ดค๋ค.
์์๋ค.
BigInteger ์๋ฃํ
๋ณ๋๋ก import๋ฌธ์ผ๋ก ๋ก๋ํด์ค์ผ ์ฌ์ฉํ ์ ์๋ ์๋ฃํ์ด๋ค.(import java.math.BigInteger)
์ด ์๋ฃํ์ ๋ค๋ฅธ ์ ์ ์๋ฃํ๊ณผ ๋ค๋ฅด๊ฒ ๋ณ์ ์ด๊ธฐํ๋ ๋ณ๋์ BigInteger ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์งํํ๊ณ ,
์ฌ์น์ฐ์ฐ ๋ํ ๋ณ๋์ ๋งค์๋๋ฅผ ํ์ฉํ๋ฉฐ, ๋งค์๋๋ก ๋๊ฒจ์ง๋ ์ฌ์น์ฐ์ฐํ ์๋ ๋ชจ๋ String ํํ๋ก ๋๊ฒจ์ง๋ค. ์๋ง String ํํ๋ก ๋๊ฒจ๋ฐ์ ๋ด๋ถ ๋งค์๋์์ ๋ณ๋์ ๋ณํ / ๋ถํ ์์ ์ ํตํ์ฌ ์ฐ์ฐ์ ์งํํ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
BigInteger์ ๋ฒ์๋ ๋ค๋ฅธ ์๋ฃํ๊ณผ ๋ฌ๋ฆฌ 70๋ฐ์ดํธ๊น์ง์ ์๋ฅผ ๋ฐ์์ ์์ด์ ์ฌ์ค์ ๋๋ถ๋ถ์ ํฐ์๋ฅผ ๋ค๋ฃจ๋๋ฐ ํฐ ์ง์ฅ์ด ์์ด ๋ณด์ธ๋ค.
์ด ์๋ฃํ์ ํ์ฉํ๊ธฐ ์ํด ์๋ long ์๋ฃํ์ ํ์ฉํ ๋์ ๋ณ์๋ฅผ BigInteger๋ก ๋์ฒดํ์๋ค.
์ฝ๋๋ ์๋์ ๊ฐ๋ค.
import java.util.Scanner;
import java.math.BigInteger;
public class Main
{
static BigInteger power(int r, int x) {
BigInteger res = new BigInteger("1");
for(int i=0; i<x; i+=1) res = res.multiply(new BigInteger(Integer.toString(r)));
return res;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
final int r = 31, m = 1234567891;
int l = Integer.parseInt(scan.nextLine());
BigInteger res = new BigInteger("0");
String str = scan.nextLine();
for(int i=0; i<l; i+=1){
BigInteger character = new BigInteger(Long.toString(str.charAt(i) - 'a' + 1));
res = res.add(character.multiply(power(r,i)));
}
res = res.remainder(new BigInteger(Integer.toString(m)));
System.out.println(res);
}
}
์ต์ข ์๋
๋๋์ด ์ ๋ต์ด๋ค.
์์ ์๋๊ฒ
- ์์๋ 2์ง์์ ํํ๋ก ์ ์ฅ๋ ๋ ์๋ฃํ์ด ํด์๋ก ๋ ๋ง์ ๋นํธ๋ฅผ ๋ด์ ์ ์์ด ๋ ๊ทผ์ ํ ํํ๋ก ์ ์ฅํ ์ ์์ผ๋, 0.5, 0.75์ฒ๋ผ ๋นํธ์ ๊ธธ์ด๊ฐ ๋ฑ ๋จ์ด์ง์ง ์๋๋ค๋ฉด ์ ํํ๊ฒ ํํํ ์ ์๋ค.
- 1๋ฒ์ ์ด์ ๋ก ์ธํด ๋ถ์ ํํ ์์๊ฐ ๋ฐ์ํ๋ฉฐ ์ด๋ฅผ ์ฐ์ฐ์ ์ด์ฉํ๋ฉด์ ๊ฒฐ๊ตญ ๋ถ์ ์ ํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๊ฒ ๋๋ค.
- ๊ฐ์ ์๋ฃํ ์ด๋๋ผ๋ ์์๋ฅผ ์ ์ฅํ ๋ ๊ณ ์ ์์์ ๋ฐฉ์ ๋ณด๋ค๋ ๋ถ๋ ์์์ ๋ฐฉ์์ ํ์ฉํ์๋ ๋ ๋ง์ ๊ฐ์๋นํธ๋ฅผ ์ ์ฅํ ์ ์์ด ๋ ์ ํํ๊ฒ ๊ฐ์ ์ ์ฅํ ์ ์๋ค.
- ํฐ ์ ์์ ์ฐ์ฐ์ ๋ถ๋์์์ ์ฐ์ฐ์ ํตํด ์งํํ ๊ฒฝ์ฐ ๊ฐ์๋นํธ๋ฅผ ์ด๊ณผํ ๊ธธ์ด์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ์ฌ ๊ฒฐ๊ณผ์ ์ผ๋ถ๋นํธ๊ฐ ์์ค๋ ์ํ๋ก ๋ฐํ๋จ์ผ๋ก์จ ์ ํํ ์ฐ์ฐ์ ํ๊ธฐ ์ด๋ ต๋ค. ํฐ์์ ์ฐ์ฐ์ ์ ๋งํด์๋ ๋ถ๋์์์ ์ฐ์ฐ์ ํ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
- ์ฌ๊ธฐ์์๋ ์์ ํ์ง ๋ชปํ์์ผ๋, ์ฌ๋ฌ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ค ํ๋๋ฅผ ๊ฒฝํํ๊ณ ๋ฐฐ์ฐ๊ฒ ๋์์.