개발자 톡
제발 반례 좀 찾아주세요 ..... 50/62 맞습니다 ㅠㅠ
- 등록일
- 2024-10-31 23:31:17
- 조회수
- 2
- 작성자
- uiop5809
const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");
const msg = input[0];
const key = input[1];
// 1. 표 채우기
const arr = Array.from(Array(5), () => Array(5).fill(0));
const alpha = Array(26).fill(false);
let col = 0, row = 0;
for (let i = 0; i < key.length; i++) {
let num = key[i].charCodeAt(0) - 'A'.charCodeAt(0);
if (!alpha[num]) {
arr[row][col++] = key[i];
alpha[num] = true;
if (col == 5) {
row++;
col = 0;
}
}
}
for (let i = 0; i < 26; i++) {
if (i === 9) continue; // J는 건너뛰
if (!alpha[i]) {
arr[row][col++] = String.fromCharCode(i + 'A'.charCodeAt(0));
if (col == 5) {
row++;
col = 0;
}
}
}
// 2. 두 글자씩 쌍을 만들고 중복 문자 처리
let res = "";
for (let i = 0; i < msg.length; i += 2) {
let first = msg[i];
let second = i + 1 < msg.length ? msg[i + 1] : 'X';
if (first == second) {
second = (first == 'X') ? 'Q' : 'X';
res += first + second;
i--; // 동일 문자가 있을 경우 i를 한 칸 뒤로 이동하여 재처리
} else {
res += first + second;
}
}
if (res.length % 2 !== 0) {
res += 'X';
}
// 3. 암호화 규칙 적용
let final = "";
for (let k = 0; k < res.length; k += 2) {
let first = res[k];
let second = res[k + 1];
let [frow, fcol, srow, scol] = [-1, -1, -1, -1];
for (let i = 0; i < 5; i++) {
for (let j = 0; j < 5; j++) {
if (arr[i][j] == first) [frow, fcol] = [i, j];
if (arr[i][j] == second) [srow, scol] = [i, j];
}
}
// 같은 행
if (frow == srow) {
final += arr[frow][(fcol + 1) % 5] + arr[srow][(scol + 1) % 5];
}
// 같은 열
else if (fcol == scol) {
final += arr[(frow + 1) % 5][fcol] + arr[(srow + 1) % 5][scol];
}
// 서로 다른 행, 열
else {
final += arr[frow][scol] + arr[srow][fcol];
}
}
console.log(final);