개발자 톡

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

JS

등록일
2024-11-12 18:01:15
조회수
31
작성자
vavoya6324

// 입력처리
const fs = require('fs')
const input = fs.readFileSync('input.txt', 'utf8')
    .trim()
    .split(/\n+/)
// 상자
let cipherBox = {}
const plainText= input[0].split('')
const keyText = input[1].split('')


let startNum;
startNum = 'A'.charCodeAt(0)


let num = 0
keyText.forEach(char => {
    if (!(char in cipherBox)) {
        cipherBox[char] = num++
    }
})


for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) {
    const char = String.fromCharCode(i)
    if (!(char in cipherBox) && char !== 'J') {
        cipherBox[char] = num++
    }
}
const cipherBoxNum = Object.keys(cipherBox)




let i = 0
const result = []
while (plainText[i]) {
    const char1 = plainText[i]
    let char2 = plainText[i + 1]


    // 서로 같은지 검사
    if (char1 === char2) {
        // XX => XQ X
        if (char1 === 'X') {
            char2 = 'Q'
        }
        // 그 외 AA => AX A
        else {
            char2 = 'X'
        }
        i += 1
    }
    // 문자 쌍이 안되면
    else {
        if (char2 === undefined) {
            char2 = 'X'
        }
        i += 2
    }


    // 이제 암호화 진행
    let index1 = cipherBox[char1]
    let index2 = cipherBox[char2]
    //console.log(char1, char2)
    //console.log(index1, index2)
    //console.log('------')
    // 같은 행
    if (Math.floor(index1 / 5) === Math.floor(index2 / 5)) {
        if (index1 % 5 === 4) {
            index1 -= 4
        }
        else {
           index1++
        }
        if (index2 % 5 === 4) {
            index2 -= 4
        }
        else {
            index2++
        }
    }
    // 같은 열
    else if ((index1 % 5) === (index2 % 5)) {
        if (index1 + 5 > 24) {
            index1 -= 20
        }
        else {
            index1 += 5
        }
        if (index2 + 5 > 24) {
            index2 -= 20
        }
        else {
            index2 += 5
        }
    }
    // 그 외
    else {
        let gap = (index1 % 5) - (index2 % 5)
        index1 -= gap
        index2 += gap
    }
    //console.log(cipherBoxNum[index1], cipherBoxNum[index2])
    //console.log(index1, index2)
    //console.log('=======')
    result.push(cipherBoxNum[index1], cipherBoxNum[index2])
}


console.log(result.join(''))








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

이 카테고리의 톡 더보기