백준 문제풀이

[BOJ C++] 백준 10914번: Veni, vidi, vici

audxkawjd17 2025. 12. 22. 18:09

 📚 문제

[BOJ C++] 백준 10914번: Veni, vidi, vici
https://www.acmicpc.net/problem/10914

 


 📝 입력 및 출력


 🔎 문제 풀이

문제 본문에 있는 그대로 해결하면 되는 문제이다. 근데 브론즈 1인데 무려 4번이나 틀려버린 문제... 그래서 내가 틀렸던 원인들을 찾아 적어보려고 한다.

 

  • 처음에는 getline으로 한 줄을 전부 받고 다시 읽는 방식으로 해결하려 했는데, 공백을 처리하기가 애매해져서 while문의 조건문에 cin>>str을 넣는 것으로 변경하였다. while문이 끝날 때 공백을 하나씩 출력해주기만 하면 된다.
  • str의 길이가 홀수이면, 맨 뒤에 있는 문자는 더미 글자이므로 pop_back() 함수를 사용하여 미리 제거한다.
  • "x"를 "yz"로 암호화 했으므로 문자를 2개씩 읽어야 한다. 그리고 $(y+z-n) mod 26$을 계산한다.

 

사진 출처: https://www.thecollector.com/i-came-i-saw-i-conquered-julius-caesar-veni-vidi-vici/

  • 첫번째 문제는 입력된 문자열의 길이가 1일 때 pop_back() 함수를 시행하고 나면 str이 빈 문자열이 되어 오류가 발생한 것이었다. 이를 해결하기 위해 for문에 !str.empty() 조건을 추가하였다.
  • 두번째 문제는 $y+z-n$의 값이 음수일 수 있다는 것이다. 예를 들어 n=10, str="aa"이면 $(0+0-10) mod 26 = -10$이 된다. 이를 해결하기 위해 모듈러 연산을 수행하기 전에 26을 더해 항상 양수가 나오도록 식을 $(y+z-n+26) mod 26$로 변경하였다.

 ⌨️ C++ 코드

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

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

    int n;
    cin >> n;
    string str;
    while (cin >> str) {
        if (str.size() % 2) str.pop_back();
        for (int i = 0; !str.empty() && i < str.size() - 1; i+=2)
            cout << (char)((str[i] - 'a' + str[i + 1] - 'a' - n + 26) % 26 + 'a');
        cout << ' ';
    }
}

왔노라, 보았노라, 이겼노라 !!