본문 바로가기

BAEKJOON/수학

백준 31430번 [A+B - 투 스텝](C++) -yes6686- 티스토리

728x90
SMALL

백준 문제 풀이: 31430 (A+B - 투 스텝)


문제 링크: https://www.acmicpc.net/problem/31430

문제 설명:

주어진 입력 조건에 따라 두 가지 동작을 수행합니다:

  1. **Step 1 (숫자 → 문자열):** 두 정수 AB를 더한 후, 그 값을 **알파벳 문자열**로 변환합니다.
  2. **Step 2 (문자열 → 숫자):** 알파벳 문자열을 읽고, 이를 **숫자로 변환**합니다.
알파벳 변환은 다음과 같은 규칙을 따릅니다:
  • 'a' = 0, 'b' = 1, ..., 'z' = 25
  • 26진법을 기반으로 합니다.


문제 해결 코드


#include <iostream>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int t; // 동작 구분 (1: 숫자 → 문자열, 2: 문자열 → 숫자)
    cin >> t;

    if (t == 1) { 
        // Step 1: 두 정수를 입력받아 문자열로 변환
        long long int a, b;
        cin >> a >> b;
        long long int k = a + b;

        string s = "aaaaaaaaaaaaa"; // 13자리 문자열 초기화
        for (int i = 0; i < s.size(); i++) {
            if (k) {
                s[i] = (k % 26) + 'a'; // 26진법에 따라 문자로 변환
                k /= 26;
            } else {
                break;
            }
        }
        cout << s << '\n';
    } 
    else { 
        // Step 2: 문자열을 입력받아 숫자로 변환
        string s;
        cin >> s;
        long long int ans = 0, r = 1;

        for (int i = 0; i < s.size(); i++) {
            ans += (s[i] - 'a') * r; // 각 문자를 숫자로 변환
            r *= 26; // 26진법 자릿수 처리
        }
        cout << ans << '\n';
    }

    return 0;
}

코드 설명

코드의 주요 로직과 사용된 알고리즘 설명:

  • Step 1 (숫자 → 문자열): 두 수의 합 k를 **26진법**으로 변환합니다. - k % 26: 알파벳으로 변환. - 'a' + (k % 26): 0 → 'a', 1 → 'b' 등의 변환.
  • Step 2 (문자열 → 숫자): 문자열의 각 문자를 **26진법** 숫자로 변환합니다. - s[i] - 'a': 각 문자를 숫자로 변환. - r *= 26: 자리 수에 따라 곱해 나갑니다.

시간 복잡도 분석

  • Step 1: 최대 13자리의 문자열 변환 → **O(log26(A + B))**
  • Step 2: 문자열 길이 n에 대해 **O(n)**입니다.

결과

문제의 조건에 따라 정확히 변환된 값을 출력합니다.

  • 입력 예시 (Step 1):
    1  
    999 1
  • 출력 예시:
    baaaaaaaaaaaaa
  • 입력 예시 (Step 2):
    2  
    baaaaaaaaaaaaa
  • 출력 예시:
    1000

다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
LIST