본문 바로가기
자료구조와 알고리즘/[Inflearn_큰돌] 10주 완성 C++ 코딩테스트

1주차-4. 11655번: ROT13

by 헛둘이 2022. 9. 26.

 

 

  • 요약하자면 입력받은 문자 하나 하나를 알파벳 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번씩 루프를 도는데 아무리 생각해도 이렇게 푸는게 훨씬 효율적인 듯 하다..
  • 앞으로 이런 문제를 만날 때는 과하지 않게 수학과 연결시켜봐야겠다..

 

 

댓글