[백준] 9322 철벽 보안 알고리즘(Python)

수경·2022년 1월 27일
0

problem solving

목록 보기
7/174

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

문제

소희는 공개키와 개인키 한 쌍으로 보안을 유지하는 것이 매우 불편하다고 생각했다. 그래서 소희는 공개키만을 이용하는 암호화 체계를 개발했다. 이를 "철벽 보안 알고리즘"이라고 부르기로 했다. 알고리즘은 다음과 같다.

  • 한 단어는 1~10개의 대문자(A-Z)들로 이루어진 문자열이다. 한 문장은 공백으로 구분된 단어들로 이루어졌다.
  • 제 1 공개키는 최대 한 번만 사용된 단어들로 되어있다.
  • 제 2 공개키는 제 1 공개키의 단어들을 재배치하여 만들어진다.
  • 평문(암호화 되지 않은 문장)은 제 1 공개키와 같이 여러 단어들로 되어있지만, 제 1 공개키와 다르게 각 단어들은 중복이 가능하다.
  • 암호문(암호화 된 문장)은 평문을 제 2 공개키를 만든 규칙의 반대로 재배치하여 만들어진다.

주어진 2개의 공개키와 암호문으로 평문을 복구하라.

입력

입력의 첫 줄에는 테스트 케이스의 수를 의미하는 하나의 정수가 입력된다. 정수는 100을 넘지 않는다.

각 테스트케이스마다 아래 항목들을 한 줄씩 입력받는다.

  • 한 문장의 단어 수 n (1 ≤ n ≤ 1 000)
  • 제 1 공개키
  • 제 2 공개키
  • 암호문

모든 단어들은 최소 1개, 최대 10개의 대문자들로 이루어져있다.

출력

각 케이스마다 암호문을 해독한 평문 을 한 줄에 줄력한다.

예제


알고리즘

1. 문제 이해

문제 도대체 뭐라는 거냐?
문제를 이해해보자

  • 암호화 방법 ➡️ 1 공개키를 2 공개키로 재배치하는 과정
  • 해독 ➡️ 암호문에 암호화 방법 을 거꾸로 적용
    ➡️ 딕셔너리인덱스를 사용해서 간단하게 재배열!

2. 어떻게?

제 1 공개키 ➡️ [ A, B, C, D ]
제 2 공개키 ➡️ [ D, A, B, C ]
암호문 ➡️ [ C, B, A, D ]
딕셔너리 d = { 제 2 공개키 원소의 제 1 공개키에서의 위치 : 암호문 원소 }
➡️ d = {2:C, 1:B, 0:A, 3:D}
➡️ dkey 값 기준으로 정렬한 후 value 값 출력
➡️ 해독!

코드

import sys

t = int(input())
for i in range(t):
	plain = []
	n = int(input())
	pub_1 = list(sys.stdin.readline().split())
	pub_2 = list(sys.stdin.readline().split())
	cyper = list(sys.stdin.readline().split())
	d = {}
	for j in pub_2:
		d[pub_1.index(j)] = cyper.pop(0)
	sorted_d = " ".join(dict(sorted(d.items())).values())
	print(sorted_d)
profile
어쩌다보니 tmi뿐인 블로그😎

0개의 댓글