백준/문제
1394번: 암호
스몰스테핑
2024. 9. 3. 14:08
문제 출처 : https://www.acmicpc.net/problem/1394
언어 : Kotlin
문제 설명 :
유진이는 현수의 암호를 알아내려고 한다. 유진이는 사전 조사를 통해 임현수의 컴퓨터에 어떤 문자들이 쓰이는지 알아내었고, 하나씩 대입해보려고 한다. 대입하는 순서는 유진이가 메모한 문자 집합의 순서대로이고, 한 글자부터 암호가 풀릴 때까지 모두 대입해본다.
예를 들어, 메모한 문자 집합이 bca라고 한다면, 유진이는 b, c, a, bb, bc, ba, cb, cc, ca, ab, ac, aa, bbb, bbc, ........ 순서로 암호가 풀릴 때까지 계속 대입해본다.
입력 :
첫 번째 줄에는 암호로 사용할 수 있는 문자가 공백 없이 주어지고, 두 번째 줄에는 컴퓨터의 암호가 주어진다. 암호에 사용할 수 있는 문자의 종류는 최대 100가지이고, 공백은 사용할 수 없다. 영문자는 대소문자를 구분한다. 암호의 길이는 최대 1,000,000자이다.
출력 :
첫 번째 줄에 주어진 암호를 몇 번의 시도로 풀 수 있는지 출력한다. 만약 수가 클 경우, 시도 횟수를 900528으로 나눈 나머지를 출력한다.
제한 사항 :
- 시간 제한 : 2초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
abcdefghijklmnopqrstuvwxyz ak |
37 |
풀이 :
암호에 사용가능한 문자 최대 100, 공백 사용 불가, 영문자는 대소문자 사용 확정.
대소문자는 26 + 26 = 52.
100 - 52 = 48문자.
아스키 코드 기준 가장 처음 나올 수 있는 문자는 느낌표(33번)
import java.io.BufferedWriter
import java.io.OutputStreamWriter
fun main() = with(System.`in`.bufferedReader()) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val str = readLine()
val password = readLine()
val arr = IntArray(200)
var result = 0
val size = str.length
for (i in str.indices) {
val index = str[i].code - '!'.code
if (arr[index] == 0) arr[index] = i + 1
}
for (element in password) {
val index = element.code - '!'.code
result *= size
result += arr[index]
result %= 900528
}
bw.write("$result")
bw.flush()
bw.close()
}