본문 바로가기
CS(Computer Science)지식/[C++][코딩 테스트] 자료구조 및 알고리즘

[C++] 백준 15312번: 이름 궁합

by 엔지니어 청년 2024. 2. 4.

문제 링크

https://www.acmicpc.net/problem/15312

풀이 방법

위 문제는 처음 입력받은 두 문자열을 한 글자씩 번갈아 가면서 대응되는 숫자 값으로 변경하여 문제를 해결할 수 있다. 해당 문제를 푼 시퀀스는 다음과 같다.

  • 코드는 두 개의 문자열 'A'와 'B'를 입력받아 각 문자에 대응하는 값을 계산한다.
  • 입력된 문자열의 길이만큼 반복하면서, 각 문자에 대응하는 알파벳 값으로 계산한 결과를 순차적으로 'result' 벡터에 저장한다.
  • 그 후, 'result' 벡터의 크기가 2보다 큰 동안 아래 과정을 반복한다.
  • 'result' 벡터를 순회하면서 현재 값과 다음 값의 합을 계산하고, 만약 합이 10 이상이면 10을 뺀 값을 'tempResult' 벡터에 저장한다.
  • 계산이 끝나면 'result' 벡터를 'tempResult'로 대체하고, 'tempResult' 벡터를 초기한다.

위 설명과 아래 코드 및 주석을 참고하면 풀이를 쉽게 이해할 수 있다.

코드

#include <bits/stdc++.h>
using namespace std;

// 각 알파벳에 대응하는 값 배열
int alphabet[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
};

int main() {
    // 입출력 속도 최적화
    ios::sync_with_stdio(false);
    cin.tie(0);

    // 이름 두 개 입력 받기
    string A, B;
    cin >> A >> B;

    // 이름의 길이
    int nameLength = A.size();

    // 각 알파벳에 대응하는 값을 계산하여 결과 벡터에 저장
    vector<int> result;
    for (int i = 0; i < nameLength; i++) {
        result.push_back(alphabet[A[i] - 'A']);
        result.push_back(alphabet[B[i] - 'A']);
    }

    // 결과를 계산하고 갱신하는 부분
    while (result.size() > 2) {
        vector<int> tempResult;
        for (int i = 0; i < result.size() - 1; i++) {
            int num = result[i] + result[i + 1];
            if (num >= 10) num -= 10;
            tempResult.push_back(num);
        }
        result = tempResult;
        tempResult.clear();
    }

    // 최종 결과 출력
    for (auto c : result) {
        cout << c;
    }

    return 0;
}