개발자 톡

연습문제 톡 [HSAT 3회 정기 코딩 인증평가 기출] 플레이페어 암호

제발 반례 좀 찾아주세요 ..... 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);


#[HSAT_3회_정기_코딩_인증평가_기출]_플레이페어_암호

이 카테고리의 톡 더보기