문제링크 : https://www.acmicpc.net/problem/15312
15312번: 이름 궁합
영어 대문자 알파벳 26개의 획수는 순서대로 3, 2, 1, 2, 3, 3, 2, 3, 3, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1 로 정한다. (출제자가 알파벳 대문자를 쓰는 방법이 기준이다)
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
string A, B;
int arr[26] = {3, 2, 1, 2, 3, 3, 2, 3, 3, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1};
vector<int>v;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> A >> B;
for(int i=0; i<A.size(); i++)
{
v.push_back(arr[A[i]-'A']); //A부터 번갈아가며
v.push_back(arr[B[i]-'A']);
}
while(v.size()>2) //마지막 숫자 2개가 남을 때까지
{
vector<int>tmp;
for(int i=0; i<v.size()-1; i++)
{
tmp.push_back((v[i]+v[i+1])%10); //인접한 숫자끼리 더한 일의 자리 값
}
v=tmp; //교체
}
cout << v[0] << v[1]; //마지막 2개
return 0;
}
입력받은 문자열 각각에 대해 이에 맞는 획수로 변환하여 벡터에 담아준다.
각 획수는 문제 힌트에 적혀있기 때문에 쉽게 알 수 있다.
그 다음으로 벡터의 사이즈가 2이하가 될때까지 인접한 숫자끼리 더한 일의 자리 값만으로 다시 갱신시켜준다.
이를 위해 임시 벡터 tmp를 선언하고, 먼저 현재 벡터 v에 담긴 인접한 숫자끼리 각각 더해주고 10으로 나눈 나머지 값을 넣어준다.
이렇게 담긴 tmp의 값들을 v와 교체해주고 위 과정을 값이 2개만 남을 때까지 반복한다.
이때 주의해야 할 것은 임시 벡터인 tmp의 값을 매번 초기화해주어야 하는 것이다.
새롭게 인접한 숫자끼리 더한 값들이 들어가야 하기때문에 기존의 값이 존재해서는 안된다.
'백준 > 실버' 카테고리의 다른 글
[백준 14606번] 피자 (Small) (C++) (0) | 2024.01.10 |
---|---|
[백준 19947번] 투자의 귀재 배추형 (C++) (0) | 2024.01.09 |
[백준 24447번] 알고리즘 수업 - 너비 우선 탐색 4 (C++) (0) | 2024.01.06 |
[백준 24483번] 알고리즘 수업 - 깊이 우선 탐색 4 (C++) (0) | 2024.01.05 |
[백준 24482번] 알고리즘 수업 - 깊이 우선 탐색 4 (C++) (0) | 2024.01.03 |