본문 바로가기
Algorithms/simulation

3 Problem A : 비밀편지

by OKOK 2019. 11. 6.

2진수로 이루어진 6자리 비트 패턴이 8개 존재한다

여기서 새로들어오는 입력과 비교하여 비트 한개가 다른 것 까지 허용한다

비트 연산 &, ^를 사용하여 패턴과 들어온 2진수를 비교한다

이때 뒤에서부터 계산하는 것을 확인한다

 

#include <stdio.h>
int pattern[8] = { 0, 15, 19, 28, 38, 41, 53, 58 };

int chk(int num) // ^ & 비트연산 사용하여, 하나만 다른지 확인하기
{
	int i, dif;
	for (i = 0; i < 8; i++) {
		dif = (num ^ pattern[i]); // 비교해서 다른 것 저장
		if ((dif & (dif - 1)) == 0) break; // 하나가 다르거나, 같으면,
	}
	return i;
}

int main()
{
	int i, j, tmp, num, arr[10], N;
	scanf("%d", &N); // 입력 받는 갯수
	for (i = 0; i < N; i++) { // i를 확장하면서 만들음
		num = 0;
		for (j = 0; j < 6; j++) {
			scanf("%1d", &tmp);
			num = num * 2 + tmp; // 2진수 6자리를 10진수로 만들기
		}
		arr[i] = chk(num); // 해당 숫자가 패턴에 있는지 확인
		if (arr[i] >= 8) { // 해석 불가한 숫자이면 
			printf("%d\n", i + 1);
			return 0;
		}
	}
	for (i = 0; i < N; i++) printf("%c", arr[i] + 'A');
	return 0;
}
5
011111000000111111000000111111
3

댓글