ROT13

문제

언어

  • JavaScript

문제 풀이 step 1

  • 문제에서 주어진 암호화 방법인 ROT13 은 주어진 문자열에서 각 문자를 알파벳이라면 13 글자를 밀고, 알파벳이 아니라면 변환하지 않는 방식으로 동작합니다.
  • 그래서 주어진 문자열에 ROT13 암호화를 진행한 결과가 정답이 됩니다.

문제 풀이 step 2

  • 특정 문자를 몇 글자 밀 때, 쉬운 방법은 ASCII 코드를 이용하는 것입니다.
    • 예를 들어 13 글자를 민다고 하면, 주어진 문자를 ASCII 코드값으로 변환하고 13 을 더하고 다시 문자 형태로 변환해주면 됩니다.
  • 이때 도움을 줄 수 있는 함수는
    • String.prototype.charCodeAt() : 주어진 index 에 대한 UTF-16 코드를 나타내는 0 부터 65535 사이의 정수를 반환합니다.
    • String.fromCharCode() : UTF-16 코드 유닛의 시퀀스로부터 문자열을 생성해서 반환합니다.
  • 위 함수들을 이용해서 주어진 문자열에 대해서 알파벳이라면 코드값으로 변환 후 13 을 더하고, 다시 문자열의 형태로 변환해서 출력하면 됩니다.
    • 단, 13 을 더했을 때 알파벳의 범위를 넘어간다면 알파벳의 총 개수인 26 을 빼줌으로써 다시 알파벳의 범위 안에 있을 수 있도록 처리해줍니다.

소스 코드

const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");

const encryptROT13 = (ch) => {
	const ACode = "A".charCodeAt(0);
	const ZCode = "Z".charCodeAt(0);
	const aCode = "a".charCodeAt(0);
	const zCode = "z".charCodeAt(0);
	let code = ch.charCodeAt(0);

	if (ACode <= code && code <= ZCode) {
		if (code + 13 > ZCode) code -= 26;
	} else if (aCode <= code && code <= zCode) {
		if (code + 13 > zCode) code -= 26;
	} else return ch;

	return String.fromCharCode(code + 13);
};

const solution = (input) => {
	const res = input[0].split("").map((v) => encryptROT13(v));
	return res.join("");
};

console.log(solution(input));