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의 갯수를 리턴하도록 했다. 그러면 한 자리당 필요한 스위치 동작 횟수를 구할 수 있다.