본문 바로가기

백준9322 - 철벽 보안 알고리즘 JS 본문

개발/algorithm

백준9322 - 철벽 보안 알고리즘 JS

자전하는명왕성 2023. 10. 1. 09:28

https://www.acmicpc.net/problem/9322

해당 문제는 3개의 문자열 (공개키1, 공개키2, 암호문)이 주어질 때, 이를 활용하여 평문으로 복호화하여 출력하는 문제다.

공개키1의 문자열이 공개키2에서 어떤 패턴으로 구성되는지 파악하고, 이를 암호문에 적용하여 복호화하면 된다.

 

아래와 같은 예시로 설명한다.

공개키 1 : A B C D
공개키 2 : D A B C
암호문 : C B A P

인덱스 0 1 2 3
공개키1 A B C D
공개키2 D A B C

공개키1, 공개키2가 위와 같이 구성되어 있다고 할 때, 공개키1을 공개키2과 같은 패턴으로 암호화한다고 하면 다음과 같다.

인덱스 1 2 3 0
암호화 A B C D

즉, [0,1,2,3]으로 구성되어 있던 공개키1가, 공개키2와 같은 패턴이 되기 위해서는 [1,2,3,0]순으로 정렬해야 한다는 이야기다.

 

그리고 우리에게는 이미 [1,2,3,0] 순으로 암호화된 [C,B,A,P][0,1,2,3] 순으로 복호화하면 되는데,

이는 해쉬테이블에 [C,B,A,P]의 각 요소를 인덱스 순으로 넣은 뒤, [1,2,3,0]로 재매핑해주면 된다.

 

전체 소스코드는 다음과 같다.

const fs = require('fs')
const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt")
  .toString().trim().split('\n')

const actDecrypt = (arr) => {
  const [key1, key2, txt] = arr.map(el => el.split(' '))
  // 앞서 설명한 방식대로 패턴 파악
  const decrypt = key1.map(el=> key2.indexOf(el))
  const table = {}
  // 해쉬테이블에 값 추가
  txt.forEach((el,idx)=> table[idx] = el)
  // 패턴 순서에 따라 해쉬테이블에 저장된 값으로 재매핑
  return decrypt.map((el)=> table[el])
}

function solution(data) {
  data.shift()

  const testCase = []

  // 문자열의 길이는 제외하고 testCase 배열에 배열 추가
  data.forEach((el,idx)=> {
    if(!isNaN(el)) testCase.push(data.slice(idx + 1, idx + 4))
  })
  
  const result = testCase.map(el=> actDecrypt(el))
  console.log(result.map(el=> el.join(' ')).join('\n'))
}

solution(input)
Comments