- 요약하자면 입력받은 문자 하나 하나를 알파벳 13칸 만큼 더하여 저장하고 그걸 출력하는 것
- 다만 Z 다음에는 A임(ROTATE)
먼저 무작정 풀어보기
#include <iostream>
#include <string>
using namespace std;
char RotMachine(char ch)
{
char ret = 0;
if ('a' <= ch && 'z' >= ch)
{
ret = ch - 'a';
for (int i = 0; i < 13; i++)
{
ret = (ret + 1) % 26;
}
return ret + 'a';
}
else if ('A' <= ch && 'Z' >= ch)
{
ret = ch - 'A';
for (int i = 0; i < 13; i++)
{
ret = (ret + 1) % 26;
}
return ret + 'A';
}
else if (ch == ' ')
return ' ';
else
return ch;
}
int main()
{
std::string str;
std::getline(std::cin, str);
std::string ret;
for (auto s : str)
{
char ch= RotMachine(s);
ret.push_back(ch);
}
std::cout << ret;
}
- 문장를 입력 받고 for문을 돌며 문자를 13칸 만큼 옮겨주는 RotMachine이라는 함수를 만들어서 처리했다.
- 대소문자에 맞게끔 처리해서 반환하게끔 했다.
- ret = (ret + 1) % 26은 예전에 rookiss님 강의에서 enum 값을 통해 계속 회전하는 방법이 기억나서 그렇게 풀었다.
- 0: UP / 1: RIGHT / 2: DOWN / 3: LEFT 라면 (DIR + 1) % 4 를 통해 루프 내내 회전하는 식
큰돌님의 풀이
#include <iostream>
#include <string>
using namespace std;
int main()
{
std::string s;
std::getline(std::cin, s);
for (int i = 0; i < s.size(); i++)
{
if (s[i] >= 'A' && s[i] <= 'Z')
{
if (s[i] + 13 > 'Z')
s[i] = s[i] + 13 - 26;
else
s[i] = s[i] + 13;
}
else if (s[i] >= 'a' && s[i] <= 'z')
{
if (s[i] + 13 > 'z')
s[i] = s[i] + 13 - 26;
else
s[i] = s[i] + 13;
}
std::cout << s[i];
}
return 0;
}
- 실제로는 비교구문에 알파벳이 아닌 숫자로 쓰셨는데 가독성을 위해 알파벳으로 변경했다.
- 'Z'(90) + 13 = 'M'(77)이 나와야 한다는 식을 통해서 90 + 13 + x = 77 이 식을 유도한 후에
- x = -26을 구하셨다.
- 내가 푼 방식은 매 문자마다 13번씩 루프를 도는데 아무리 생각해도 이렇게 푸는게 훨씬 효율적인 듯 하다..
- 앞으로 이런 문제를 만날 때는 과하지 않게 수학과 연결시켜봐야겠다..
'자료구조와 알고리즘 > [Inflearn_큰돌] 10주 완성 C++ 코딩테스트' 카테고리의 다른 글
부록 : i, j로 이루어진 이중 for문 에서 j < i가 조건일 때 시간복잡도 계산 (0) | 2023.03.27 |
---|---|
1주차-5. 9996번: 한국이 그리울 땐 서버에 접속하지 (0) | 2022.09.27 |
1주차-3. 1159번 농구 경기 (1) | 2022.09.26 |
1주차-2. 10988번 팰린드롬인지 확인하기 (2) | 2022.09.13 |
1주차-1. 2979번 트럭 주차, 카운팅 배열에 대한 개념 (0) | 2022.09.12 |
댓글