※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25562번 문제인 차의 개수이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25562
\(N\)개의 수의 차의 가짓수의 최댓값은 \(N(N-1)/2\) 이하임은 자명하다. 이는 \(N\)개의 수 중 서로 다른 두 수를 고르는 경우의 수와 같다. 한편 \(N\)개의 수를 \(2^k\) (단, \(k\)는 0 이상 \(N\) 미만의 정수)와 같이 고르면 어떤 두 수를 골라도 차가 같게 나오는 경우가 없음을 확인할 수 있다. (이해가 잘 안 된다면, 두 수의 차를 이진수로 나타내 차가 어떠한 형태로 나타나는지를 관찰해보자.) 따라서 \(2^k\) (단, \(k\)는 0 이상 \(N\) 미만의 정수)와 같이 \(N\)개의 수를 고르는 것은 차의 가짓수를 최대(\(N(N-1)/2\)개)로 하는 방법이 됨을 알 수 있다.
\(N\)개의 수의 차의 가짓수의 최솟값은 \(N-1\) 이상임은 자명하다. \(N\)개의 수 중 가장 큰 수와 나머지 수와의 차의 값은 서로 다르기 때문이다. 한편 \(N\)개의 수를 1 이상 \(N\) 이하와 같이 고르면 가능한 차는 각각 1 이상 \(N-1\) 이하의 총 \(N-1\)가지가 됨을 알 수 있다. 따라서 1부터 \(N\)까지의 수를 고르는 것은 차의 가짓수를 최소(\(N-1\)개)로 하는 방법이 됨을 알 수 있다.
위 관찰을 이용해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int N;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
cout << N * (N - 1) / 2 << '\n';
for (int i = 0; i < N; i++) cout << (1 << i) << ' ';
cout << '\n' << N - 1 << '\n';
for (int i = 1; i <= N; i++) cout << i << ' ';
}
'BOJ' 카테고리의 다른 글
[BOJ 31867 // C++] 홀짝홀짝 (0) | 2024.05.23 |
---|---|
[BOJ 31866 // C++] 손가락 게임 (0) | 2024.05.22 |
[BOJ 16516 // C++] Lipschitz Constant (0) | 2024.05.20 |
[BOJ 24731 // C++] XOR-ABC (0) | 2024.05.19 |
[BOJ 30679 // C++] 별 가두기 (0) | 2024.05.18 |