728x90
반응형
문제
내가 작성한 코드 (C++ 성공)
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char t[101];
cin >> t;
char key = t[0] ^ 'C';
for(int i=0; i<strlen(t); i++){
cout << (char)(t[i] ^ key);
}
return 0;
}
정리
정말 XOR 을 이용해서 푸는 문제일거라고는 생각지도 못했다.
처음에 정말 아스키코드의 값으로 차이를 구해서 푸는 문제인줄 알았는데 틀렸다.
그래서 정말 쉬운 문제인건 맞는데 왜 모르겠지 라고 계속 생각했더니 정말 XOR 연산을 이용해서 푸는 문제였다.
XOR 연산이란, 비트연산의 하나인데 두 개의 값이 서로 다른 경우 1, 아닌 경우 0을 출력하는 연산이다. 따라서, 0 1 , 1 0 일 경우 1 0 0 , 1 1 일 경우 0 으로 계산한다. XOR 연산을 하기 위해서 다음과 같이 할 수 있다. A ^ B (XOR 연산) |
따라서, 각 문자를 XOR 비트 연산을 통해서 암호화 했다는 것이다.
그래서 복호화를 하기 위해서는 다시 XOR을 통해서 key의 값을 구해줘야 한다.
여기서 알아야할 부분은 하나의 문자를 XOR 연산을 통해서 값을 구했는데 어떤 값으로 XOR 연산을 했냐는 것이다.
이 부분을 구하기 위해서는 결과값과 초기값을 XOR 연산하면 구할 수 있다.
원래의 문자(A) ^ KEY = XOR 연산된 문자(B) KEY = XOR 연산된 문자(B) ^ 원래의 문자(A) 따라서, 원래의 문자(A) = XOR 연산된 문자(B) ^ KEY 를 해주면 원래의 문자열을 구할 수 있다. |
문제에서 원래의 문자 처음 8글자가 "CHICKENS" 가 주어졌기때문에
'C' 의 문자 (A) 와 입력한 문자의 첫 번째 문자 (B) 를 XOR 연산을 통해 KEY 의 값을 구해준다.
그리고 입력받은 문자열을 KEY을 이용해 XOR 연산을 해주게 되면 원래의 문자열을 구할 수 있다.
728x90
반응형
'알고리즘 > BaekJoon' 카테고리의 다른 글
[백준 알고리즘] 2698번 : 인접한 비트의 개수 (0) | 2019.08.24 |
---|---|
[백준 알고리즘] 17288번 : 3개만! (0) | 2019.08.15 |
[백준 알고리즘] 17284번 : Vending Machine (0) | 2019.08.15 |
[백준 알고리즘] 17283번 : I am Groot (0) | 2019.08.15 |
[백준 알고리즘] 8595번 : 히든 넘버 (0) | 2019.08.15 |