문제
https://algospot.com/judge/problem/read/HAMMINGCODE
해밍코드(http://ko.wikipedia.org/wiki/%ED%95%B4%EB%B0%8D_%EB%B6%80%ED%98%B8)
해밍코드란 리처드 해밍이 제안한 오류정정코드다. 보통 해밍코드라고하면 (7,4)해밍코드를 뜻한다.
(7,4)해밍코드는 4비트 데이터비트와 3비트의 패리티비트로 이루어진다.
좀더 알아보기위해서 1000을 해밍코드로 변환해보자. 7비트중에 패리티비트의 위치는 2의거듭재곱번째 위치에 있는 비트가 패리티 비트가 된다.
1 | 2 | 3 | 4 | 5 | 6 | 7 |
2^0자리 | 2^1자리 | 2^2자리 | ||||
1 | 0 | 0 | 0 |
위의 표와같이 메세지 1000을 배치한 후에 패리티비트를 채워준다.
1 : 1자리부터 시작해서 1비트 검사하고 1비트 건너뛰기를 반복한다. 1,3,5,7 자리 xor 한 결과는 1^0^0^ = 1
2 : 2자리부터 시작해서 2bit검사하고 2bit건너뛰기를 반복한다.2,3,6,7 자리 xor 한 결과는 1^0^0 = 1
4 : 4자리부터 시작해서 4bit검사한다. 건너뛸비트가 없다 끝이다. 4,5,6,7 자리 xor 한 결과는 0^0^0 = 0
만들어진 해밍코드는 1110000 ~~
자 이제 오류검출게임을 시작하지~
1110000을 보냈지만 받은사람이 3번째 자리가 잘못된 1100000을 받았다고 가정하고 오류검출을 해보자.
위에서 패리티 비트 만들었던 것과 순서는 같다.
1 : 1자리부터 시작해서 1비트 검사하고 1비트 건너뛰기를 반복한다. 1,3,5,7 자리 xor 한 결과는 1^0^0^0 = 1
2 : 2자리부터 시작해서 2bit검사하고 2bit건너뛰기를 반복한다.2,3,6,7 자리 xor 한 결과는 1^0^0^0 = 1
4 : 4자리부터 시작해서 4bit검사한다. 건너뛸비트가 없다 끝이다. 4,5,6,7 자리 xor 한 결과는 0^0^0^0 = 0
각 결과 값들을 2진수로 나열했을 때 011이 된다.10진수로 3이되고 3번째 bit가 잘못되었다고 검출되었다.~정답
입력
7비트 해밍코드
출력
올바른 데이터 검출 4bit
풀이
7bit 값을 입력받아서 시프트연산을 통해서 패리티비트를 구해낸다음에 결과값을 나열해서 0이 아니면
결과값이 가리키는 자릿수의 bit를 반전해준다.
package com.tutorial;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class HAMMINGCODE {
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System. in));
int cnt = Integer.parseInt(br.readLine());
while (cnt -- > 0) {
hcode h = new hcode(br.readLine());
h.check();
System.out.println(h.getData());
}
}
}
class hcode {
private int n;
private char[] s;
public hcode(String a) {
this.s = a.toCharArray();
this.n = Integer.valueOf(a, 2);
}
public void check() {
String check = "";
check += n & 1 ^ n >> 1 & 1 ^ n >> 2 & 1 ^ n >> 3 & 1;
check += n & 1 ^ n >> 1 & 1 ^ n >> 4 & 1 ^ n >> 5 & 1;
check += n & 1 ^ n >> 2 & 1 ^ n >> 4 & 1 ^ n >> 6 & 1;
int result = Integer.valueOf(check, 2);
if (result != 0) {
s[result - 1] = (s[result - 1] == '0')
? '1'
: '0';
}
}
public String getData() {
return s[2] + "" + s[4] + "" + s[5] + "" + s[6];
}
}
'Algorithm > Algospot' 카테고리의 다른 글
[algospot]FIXPAREN (0) | 2014.12.15 |
---|---|
[algospot]BRACKETS2 (0) | 2014.12.15 |
[algospot]WEIRD (0) | 2014.12.15 |
[algospot]URI (0) | 2014.12.15 |
[algospot]XHAENEUNG (0) | 2014.12.11 |