mulll

[소프티어] 전광판 / C++ 해설 본문

algorithm study

[소프티어] 전광판 / C++ 해설

dongha 2023. 1. 1. 21:54

더 많은 문제풀이는 아래 Github 주소에서 확인하실 수 있습니다.

https://github.com/Dongha-k/softeer-code

 

GitHub - Dongha-k/softeer-code: softeer 문제 풀이입니다.

softeer 문제 풀이입니다. Contribute to Dongha-k/softeer-code development by creating an account on GitHub.

github.com

문제 출처: https://softeer.ai/practice/info.do?idx=1&eid=624 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

#include <iostream>
#include <string>
using namespace std;

unsigned char segment[11] = {
	0b11111100,
	0b01100000,
	0b11011010,
	0b11110010,
	0b01100110,
	0b10110110,
	0b10111110,
	0b11100100,
	0b11111110,
	0b11110110,
	0b00000000
};
int get_bit_count(unsigned char c){
	int cnt = 0;
	for(int i = 0 ; i < 8 ; i ++){
		if( ( (c & (1 << i) ) >> i) == 1) cnt ++;
	}
	return cnt;
}

int get_diff(int a, int b){
	unsigned char res = segment[a]^segment[b];
	return get_bit_count(res);
}

int main(int argc, char** argv)
{
	int n;

	cin >> n;
	for(int i = 0 ; i < n ; i ++){
		int res = 0;

		string a, b;
		cin >> a >> b;
		if(a.size() > b.size()){
			int len = a.size() - b.size();
			for(int i = 0 ; i < len ; i ++){
				b = (char)('0' + 10) + b;
			}
		}
		else {
			int len = b.size() - a.size();
			for(int i = 0 ; i < len ; i ++){
				a = (char)('0' + 10) + a;
			}
		}
		for(int i = 0 ; i < b.size() ; i ++){
			res += get_diff(a[i] - '0', b[i] - '0');
		}
		cout << res << '\n';
		
	}

	return 0;
}

 

해설: 비트연산 사용

 

a와 b를 입력받아 빈 칸(segment에서는 10번째 인덱스에 해당)으로 값을 채워줘서 길이를 같게 하였고 a와 b의 다른 비트의 숫자를 계산하기 위해 xor연산을 먼저하였다. 1인 비트의 자리는 a 와 b가 서로 비트가 다르다는 뜻이고 0 인 경우는 a 와 b가 서로 비트가 같다는 뜻이다. xor 연산 결과에서 이진수에서 1의 갯수를 세는 함수를 만들어 1의 갯수를 리턴하도록 했다. 그러면 한 자리당 필요한 스위치 동작 횟수를 구할 수 있다.

Comments