문제 출처: https://algospot.com/judge/problem/read/HAMMINGCODE
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. 느낀 점
영어로 된 문제라 조금 서툴렀고, 잘못 이해한 부분이 있어서 조금 걸리긴 했지만 문제의 설명을 제대로 이해한다면 어려운 문제는 아닌 것 같다.
'컴퓨터 > 알고스팟 알고리즘' 카테고리의 다른 글
알고스팟 알고리즘: BOARDCOVER [C++] (0) | 2021.08.19 |
---|---|
알고스팟 알고리즘: 록 페스티벌(FESTIVAL) [C++] (0) | 2021.07.31 |
알고스팟 알고리즘: WEIRD [C++] (0) | 2021.05.24 |
알고스팟 알고리즘: XHAENEUNG [C++] (0) | 2021.05.23 |
알고스팟 알고리즘: URI [C++] (0) | 2021.05.22 |