📚 문제
[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$을 계산한다.

- 첫번째 문제는 입력된 문자열의 길이가 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 << ' ';
}
}
왔노라, 보았노라, 이겼노라 !!
'백준 문제풀이' 카테고리의 다른 글
| [BOJ Java] 백준 2170번: 선 긋기 (0) | 2026.02.04 |
|---|---|
| [BOJ Java] 백준 24465번: 데뷔의 꿈 (0) | 2026.01.18 |
| [BOJ C++] 백준 1916번: 최소비용 구하기 (0) | 2025.12.20 |
| [BOJ C++] 백준 30805번: 사전 순 최대 공통 부분 수열 (0) | 2025.11.12 |
| [BOJ C++] 백준 15971번: 두 로봇 (1) | 2025.11.08 |