halang-log
💡 PS

[BOJ] 1394 암호

date
Mar 12, 2022
slug
boj-1394
author
status
Public
tags
PS
summary
암호 문제에 대한 풀이입니다.
type
Post
thumbnail
category
💡 PS
updatedAt
Aug 3, 2023 09:11 AM
언어

문제

풀이

암호로 사용할 수 있는 문자들을 맵에 저장해준다.
만약 암호가 4자리라면,
암호가 한자리일 경우 + 암호가 두자리일 경우 + 암호가 세자리일 경우 를 먼저 더해준다.
이 과정이 18~21번째 줄이다.
만약, 암호로 사용할 수 있는 문자열이 abc이고 암호가 ca라고 해보자.
암호가 한자리일 경우 a, b, c 총 3가지의 경우가 있다.
암호가 두자리일 경우를 보자.
여기서
a가 첫번째 자리일 경우 aa, ab, ac 총 3가지,
b가 첫번쨰 자리일 경우 ba, bb, bc 총 3가지이다.
(3-1) * 암호자리 수 = 6 (24번째줄)
이런식으로 하면 된다.
마지막에 +1을 추가해주어야 하며, % MOD도 해줘야 한다. (더했을 때 900528일 경우를 대비)

코드

#include <iostream> #include <cstdio> #include <map> #define MOD 900528 using namespace std; typedef long long ll; string s,m; map<char, int> mp; ll ans = 0; int main() { cin >> s; // 암호로 사용할 수 있는 문자 for(int i = 0; i < s.size(); i++) mp[s[i]] = i+1; cin >> m; // 암호 int sz = m.size(); // 암호 크기 ll k = s.size(); for(int i = 1; i < sz; i++) { ans = (ans + k) % MOD; k = (k * s.size()) % MOD; } k = 1; for(int i = sz-1; i >= 0; i--) { ll t = ((mp[m[i]] - mp[s[0]]) % MOD * k) % MOD; ans = (ans + t) % MOD; k = (k * s.size()) % MOD; } printf("%lld", (ans + 1) % MOD); }