본문 바로가기

컴퓨터/알고스팟 알고리즘

알고스팟 알고리즘: HAMMINGCODE [C++]

문제 출처: https://algospot.com/judge/problem/read/HAMMINGCODE

 

algospot.com :: HAMMINGCODE

Hamming Code 문제 정보 문제 Jaeha is writing an operating system for his toys, so they will be able to communicate with each other. However, the wireless chips in his toys are very cheap, so they are prone to transmission errors. Quite frequently, Ja

algospot.com

1. 코드

#include <iostream>
using namespace std;

//XOR 연산
bool checking(int a, int b, int c, int d)
{
	return a ^ b ^ c ^ d;
}

//XOR 연산 결과에 따른 오류 위치 값 확인
void check(string& x)
{
	bool a = checking(x[0] - '0', x[2] - '0', x[4] - '0', x[6] - '0');
	bool b = checking(x[1] - '0', x[2] - '0', x[5] - '0', x[6] - '0');
	bool c = checking(x[3] - '0', x[4] - '0', x[5] - '0', x[6] - '0');

	int index;
	index = a * 1 + b * 2 + c * 4 - 1;		//오류 위치값 2진수에서 십진수로

	//오류가 있다면 실행
	if (index >= 0) {
		//오류 위치값 반대로 저장
		if (x[index] - '0') x[index] = 0 + '0';
		else x[index] = 1 + '0';
	}
}

int main(void)
{
	int t;
	cin >> t;

	while (t--)
	{
		string arr;
		cin >> arr;
		check(arr);

		cout << arr[2] << arr[4] << arr[5] << arr[6] << endl;
	}
}

(실행)

2. 해결 방법

string을 이용하여 인코딩 된 값을 문자열로 입력을 받은 후 정해진 위치에 대해서 XOR 연산을 진행한 뒤 신드롬(syndrome) 값을 도출해서 오류가 발생한 인덱스 값을 탐색한 뒤 해당 위치의 값을 1이라면 0으로 0이라면 1로 바꾸어주는데 만약 오류가 발생하지 않으면 그 무엇도 바꾸지 않는다. 그리고 3, 5, 6, 7번째의 값들을 출력해준다.

인코딩 된 값을 입력받을 때 문자열로 입력을 받았기에 '0'을 빼줌으로써 정수 값으로 변환시켜서 XOR 연산을 진행시키면 수월하게 진행할 수 있다.

3. 느낀 점

영어로 된 문제라 조금 서툴렀고, 잘못 이해한 부분이 있어서 조금 걸리긴 했지만 문제의 설명을 제대로 이해한다면 어려운 문제는 아닌 것 같다.