당니의 개발자 스토리
1-F 본문
내 풀이(http://boj.kr/05551490cf574d8095365c510a8a4777) - 맞음
공유 소스 보기
www.acmicpc.net
1-F (다시 풀기)
오늘은 1-F 11655 ROT13 문제를 풀어보도록 하겠습니다.

자 이 문제는 개행 문자, 띄어쓰기까지 포함된 어떠한 문자열을 받아야 됩니다.그러니까 getline으로 문자열을 받아야겠죠?
getline으로 받은 문자열을 ROT13 이라는 어떤 알고리즘을 기반으로 이 문자열이 어떠한 문자열로 변환되는 거죠.
그러면 이 ROT13 이라는 알고리즘이 무엇인지를 파악을 해서, 어떠한 문자열이 왔을 때 ROT13을 거쳐서 변환해주는 프로그램을 만들면 되는 겁니다.
자 이 문제의 예시를 보시면,

B는 O가 되구요, a는 n이 되는 걸 볼 수가 있죠.

여러분 대문자 B와 대문자 O를 ASCII 코드로 변환하면 뭐가 되죠? 66이랑 79 이고, 소문자 a랑 소문자 n을 ASCII 코드로 변환하면, 97이랑 110이 되죠.

이 차이는 13이죠? '아! ROT 13이라는 것은 사실은 어떠한 문자열에다가 각각 이렇게 + 13을 한 게 아닐까?' 라고 유추할 수가 있는 거죠.
근데 여러분 여기서 질문, '아니 선생님 어떻게 바로 ASCII 코드가 66인지 97인지 나오나요?' 라고 할 수가 있겠죠.
교안에 있는 ASCII 코드를 잠깐 보도록 하겠습니다.

대문자 A는 65 소문자 a는 97이죠. 이것만 외우라고 했잖아요.
일단 이렇게 해서 알 수 있는데,

우리가 B에서 O가 되는 건 알겠어요. 근데 O에서 B가 되는 건 어떻게 되죠?

O라는 알파벳이 79라는 ASCII 코드를 갖는데, 이 79에다가 + 13을 하게 되면 92가 되죠.

92를 ASCII 코드로 나타내면 사실은 이거예요. 알파벳이 아닌 문자가 나옵니다.

그래서 '만약에 Z 끝까지 오면 이렇게 다시 대문자 A부터 시작을 해야 되는구나' 라는 것을 알 수가 라고 유추를 할 수가 있겠죠.

그러면 이 부분만큼을 빼주면 되겠네요. 그니까 92라는 숫자에서 이 부분만큼을 빼줘서 얘를 여기서부터 시작하게끔 만들면 되겠네요.
+ 13을 한 게 z를 넘어갈 때는 이만큼을 빼주는 거죠.

우리 알파벳은 26개죠. 그래서 92에서 26을 빼주는 겁니다.

92-26을 하게 되면 66이죠. 즉 66을 아스키 코드 문자로 나타내면 B가 나오는 걸 볼 수가 있죠.
그리고 이 문제 같은 경우는 소문자는 소문자끼리, 대문자는 대문자끼리 하는 것도 유의 깊게 봐주시면 됩니다.
코드를 통해서 보도록 하겠습니다.

자 일단 개행문자, 띄어쓰기까지 입력을 받아야 되기 때문에 getline으로 문자열 입력을 받습니다.
그리고 나서, 문자 하나하나 분석을 합니다. 대문자인 경우는 65부터 97까지 라고 해놨죠. 사실은 정확히 얘기를 하면,

90까지 입니다. 그래도

이렇게 해도 무방합니다.

그리고 나서, 대문자인 경우에 끝을 넘어간다고 하면 - 26을 해줍니다. 우리 알파벳 개수만큼 해주는 거예요.
그게 아니라면 그냥 + 13 해줍니다.
소문자의 경우에도 똑같이 해주면 됩니다.