백준: Silver⑥ - 1740, 1769, 1789, 1812
</br>
계속 풀이
</br>
1740: 거듭제곱
https://www.acmicpc.net/problem/1740
서로 다른 3의 제곱으로 표현되는 수 n 구하기
방법 1.
long long n;
cin >> n;
int ind = 0;
while( n > 0 ){
bits[ind++] = n % 2;
n /= 2;
}
unsigned long long cnt = 1, ans = 0;
for(int i = 0; i < ind; i++){
if( bits[i] ) ans += cnt;
cnt *= 3;
}
cout << ans << endl;
헉… 갑자기 좀 까다롭다
삼진법을 사용하면 되겠다는 건 알았는데, long long으로 선언하고 for문으로 n & (1 << i)
를 사용했는데 계속 32비트까지밖에 안 되더라!!
그래서 bits[]
에다가 n을 이진수로 바꿔서 저장하고 답을 구했다.
방법 2.
long long n;
cin >> n;
long long cnt = 1, ans = 0;
for(long long i = 0; i < 64; i++){
if( n & (1LL << i) ) ans += cnt;
cnt *= 3;
}
cout << ans << endl;
나중에 찾아 보니, 쉬프트 연산을 받는 1이 32비트 정수형이라서 그렇다고 한다…
그래서 (long long )1
, 또는 1LL
이라 적고 쉬프트 해 주면 잘 되더라.
또 이렇게 배워 갑니다
</br>
1769: 3의 배수
https://www.acmcpc.net/problem/1769
어떤 수의 모든 자리를 더한 게 3의 배수면 그 수도 3의 배수다. 자리수 합이 한 자리수가 되게 하려면 이 변환을 몇 번 거쳐야 할까
int cnt = 0;
string y = n;
while( y.size() > 1 ){
long long sum = 0;
for(int i = 0; i < y.size(); i++){
sum += y[i] - '0';
}
y = to_string(sum);
cnt++;
}
cout << cnt << endl;
if( y[0] == '3' || y[0] == '6' || y[0] == '9' ) cout << "YES" << endl;
else cout << "NO" << endl;
또 조건을 잘못 봐서 한 번 틀렸다. X가 1000000자리 이하의 수라고 한다. 짱 길다는 뜻
그래서 string으로 받고 다 더해줬다. 그게 한 자리수가 될 때까지 반복하기
</br>
1789: 수들의 합
https://www.acmcpc.net/problem/1789
S가 최대 몇 개의 서로 다른 자연수들의 합으로 이루어질까
for(int i = 1; i < 100000; i++){
long long sum = (long long)i*(i+1) / 2;
if( sum > n ){
cout << i-1 << endl;
break;
}
}
간단하게 생각해 보니 최대로 서로 다른 자연수들의 합이니 당연히 1부터 더해야 할 것 같고… 그럼 1부터 i까지의 합으로 나타나지겠다.
따라서 1부터 i까지의 합과, 1부터 i+1까지의 합 사이의 S들은 전부 i개의 수들로 표현이 될 거다.
</br>
1812: 사탕
https://www.acmicpc.net/problem/1812
옆사람과의 사탕 개수 합만 알 때 각자의 개수 알아내기
int sum = 0, sum2 = 0;
for(int i = 0; i < n; i++){
int a;
cin >> a;
v.push_back(a);
sum += a;
if( i%2 == 0 )sum2 += a;
}
sum2 -= v[n-1];
sum /= 2;
candies[n-1] = sum - sum2;
int c = candies[n-1];
for(int i = n-2; i >= 0; i--){
candies[i] = v[i] - c;
c = candies[i];
}
for(int i = 0; i < n; i++){
cout << candies[i] << endl;
}
n이 홀수이므로,
a1 + a2 + a3 + a4 + a5 = s
- a1 + a2 a3 + a4
a5 = s - ?
이렇게 생각해서 마지막 사람의 사탕 개수를 구할 수 있다
그걸로 계속 계속 구해주면 끝
</br>
이제 108문제 풀었고 학교 랭킹 159등이 되었다
등수 간 문제 수가 좀 차이나기 시작한다.
정답률은 42.857%다~~ 많이 늘었네
</br>
댓글남기기