[문제 위치]
https://www.acmicpc.net/problem/15312
[문제 풀이]
각 글자의 획수를 기반으로 궁합 점수를 계산하는 구현 문제다. 이름은 같은 길이로 주어지며, A부터 Z까지 알파벳 각각에 대해 정해진 획수 배열을 기반으로 계산을 진행한다. 먼저 알파벳마다의 획수를 정수 배열에 저장한다. 예를 들어 A는 3획, B는 2획처럼, 문제에서 주어진 값들을 그대로 배열에 넣고, 각 글자의 인덱스를 계산할 땐 'A'를 기준으로 빼서 처리한다.
그다음 입력받은 이름 두 개에서 글자를 번갈아가며 꺼낸 뒤, 각각의 획수를 배열에서 찾아 정수로 변환하여 순서대로 벡터에 저장한다. 이 벡터가 초기 궁합 계산의 바탕이 되는 배열이다. 이제 이 배열의 크기가 2가 될 때까지 반복 작업을 한다. 매 반복마다 인접한 두 숫자를 더한 뒤, 그 합의 일의 자리 수(10으로 나눈 나머지)를 새로운 배열에 저장한다. 그렇게 해서 배열이 점점 줄어들게 만들고, 마지막에 숫자 두 개만 남게 되었을 때, 그 두 수를 이어서 출력하면 최종 궁합 점수가 된다.
전체 과정은 이름을 숫자의 흐름으로 치환한 뒤, 반복적인 덧셈과 나머지 연산을 통해 관계를 압축해가는 방식으로 볼 수 있다. 구현 자체는 간단하지만 배열 처리와 반복 계산 흐름을 제대로 이해하고 있어야 실수가 없다. 특히 각 자리에서 번갈아 이름을 섞는 과정과 배열을 줄여가는 방식이 핵심이므로, 그 부분만 명확히 하면 어렵지 않게 해결할 수 있는 문제다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
int base[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};
string a, b;
cin >> a >> b;
int n = a.length();
vector<int> arr;
arr.reserve(n*2);
for(int i=0;i<n;i++){
arr.push_back(base[a[i]-'A']);
arr.push_back(base[b[i]-'A']);
}
while(arr.size() > 2){
vector<int> next;
next.reserve(arr.size()-1);
for(size_t i=0;i+1<arr.size();i++){
next.push_back((arr[i] + arr[i+1]) % 10);
}
arr.swap(next);
}
cout << arr[0] << arr[1];
return 0;
}'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글
| [Silver V] 메시지 - 1384 (2) | 2025.08.03 |
|---|---|
| [Silver V] 욕심쟁이 돼지 - 3060 (1) | 2025.08.03 |
| [Silver V] 회문인 수 - 11068 (0) | 2025.08.02 |
| [Gold II] 피보나치 수 3 - 2749 (2) | 2025.07.30 |
| [Gold III] 변형 계단 수 - 18244 (3) | 2025.07.29 |