Programmers/Level 2
C++ / 프로그래머스 / 2개 이하로 다른 비트
GitHubSeob
2023. 9. 5. 19:50
문제 |
https://school.programmers.co.kr/learn/courses/30/lessons/77885
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이 |
처음엔 bitset, xor연산을 이용해서 구하려 했는데 테스트케이스 10, 11번에서 시간초과가 떠서 방법을 바꿨다.
최하위 비트에서부터 시작해서 0인 자리를 찾고 0인 자리와 그 아래 자리의 비트를 반전시키면 된다.
주어지는 숫자의 최대값은 10^15 이기 때문에 넉넉하게 bitset을 60자리로 표현하였다.
for (int idx = 0; idx < 60; ++idx) {
if (num.test(idx) == 0) {
num.flip(idx);
if (idx != 0)
num.flip(idx - 1);
answer[num_idx] = num.to_ullong();
break;
}
}
test(idx)는 idx번째 비트를 확인하는 함수이다.
flip(idx)는 idx번째 비트를 반전시키는 함수이다.
두 비트, 또는 한 비트를 반전시키고 bitset to ull함수를 통해 long long 값으로 바꿔준다.
코드 |
#include <string>
#include <vector>
#include <bitset>
#define ll long long
using namespace std;
vector<ll> solution(vector<ll> numbers) {
vector<ll> answer(numbers.size(), 0);
for (int num_idx = 0; num_idx < numbers.size(); ++num_idx) {
bitset<60>num = numbers[num_idx];
for (int idx = 0; idx < 60; ++idx) {
if (num.test(idx) == 0) {
num.flip(idx);
if (idx != 0)
num.flip(idx - 1);
answer[num_idx] = num.to_ullong();
break;
}
}
}
return answer;
}