728x90
반응형

문제

17285번 : XORChic

 

17285번: XORChic

첫째 줄에 XOR 연산이 수행된 문자열 T가 주어진다. (10 ≤ T의 길이 ≤ 100) 문자열 T는 인쇄 가능한 문자(Printable character)로만 이루어져 있다.

www.acmicpc.net

 

내가 작성한 코드 (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
반응형
복사했습니다!