// 비트 AND 연산 활용방법
// 자연수 n이 주어졌을 때
// n 이 2의 20승보다 작은 경우로 가정 (아래 for문에서 20으로 범위를 잡은 이유)
int cnt = 0;
for (int i=0; i<20; i++)
{
// i 만큼 shift 하며 비트 AND연산하여, 1이 있는 경우 ++
if (n & 0x01 << i)
cnt++;
}
2. bitset 사용하는 방법
// bitset 활용방법
// 자연수 n이 주어졌을 때
// n 이 2의 20승보다 작은 경우로 가정 (아래 for문에서 20으로 범위를 잡은 이유)
#include <bitset>
using namespace std;
// bitset 중에서 1인 비트의 개수를 반환
int cnt = bitset<20>(n).count();
// 연속된 숫자의 합을 구하는 함수
// 예를들어, 1~10까지 합을 구하려면
// (10-1+1)/2 * (10+1) 을 해주면 된다.
// 풀이하자면, 1+10, 2+9, 3+8, 4+7, 5+6 이렇게 11이 5개가 있기 때문에
// 위 방식을 아래의 수식으로 풀어서 연산량을 줄인다.
int sum_continue_num(int a, int b){
return (b - a + 1)/2 * (a + b);
}
// 주어진 자연수 n이 있을 때,
// 연속된 자연수의 합이 몇 개 있는지 계산하는 로직
int solution(int n) {
int answer = 0;
// 이중 loop
// 1부터 n까지 더해가는 과정을 체크해본다
for(int i=1 ; i <= n ; i++){
for(int j=i ; j <= n ; j++){
// 연속된 자연수의 합이 주어진 n보다 커지면,
// 그 뒤에 더해지는 숫자는 의미없으므로 break로 넘어감
if( sum_continue_num(i,j) > n ){
break;
}
// 연속된 자연수의 합이 일치하면 정답을 더함
if( sum_continue_num(i,j) == n ){
answer++;
break;
}
}
}
return answer;
}
#include <algorithm>
#include <vector>
int test(vector<int> a)
{
// a 가 { 1, 3, 2 } 인 경우,
sort(a.begin(), a.end());
// 위 로직후, a 의 결과
// { 1, 2, 3 }
sort(a.rbegin(), a.rend());
// 위 로직후, a 의 결과
// { 3, 2, 1 }
reverse(a.begin(), a.end());
// 위 로직후, a 의 결과
// { 1, 2, 3 }
}