※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 12970번 문제인 AB이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/12970
12970번: AB
첫째 줄에 문제의 조건을 만족하는 문자열 S를 출력한다. 가능한 S가 여러 가지라면, 아무거나 출력한다. 만약, 그러한 S가 존재하지 않는 경우에는 -1을 출력한다.
www.acmicpc.net
글쓴이는 아래와 같은 전략을 이용하였다.
1) A를 N/2개, B를 N-N/2개 이용할 것이다. AB 개수의 최댓값은 (A의 개수)*(B의 개수)가 된다.
1-1) K가 AB 개수의 최댓값을 넘어간다면 -1을 출력해주자.
2) 정수 AA를 K/B, BB를 K%B라 하자.
문자열의 시작에 AA개의 'A'를, 문자열의 끝을 'A' 하나와 'B' BB개를 쓴 뒤 남은 'A'를 채워넣고 시작과 끝 사이에는 남은 'B'를 채워넣으면 K개의 AB가 포함된 문자열을 얻을 수 있다. 시작부분의 A가 포함된 K/B쌍의 AB와 뒤에 따로 있는 A가 포함된 K%B쌍의 AB의 개수를 합하면 K쌍의 AB를 얻을 수 있기 때문이다.
이와 같이 구현할 때, K가 가능한 최댓값이 주어진 경우를 보더케이스로 생각해야함에 유의하자. (잔여 A가 남지 않기 때문이다)
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, K; cin >> N >> K;
int A = N / 2; int B = N - A;
if (K > A * B) cout << -1;
else if (K == A * B) {
while (A--) cout << 'A';
while (B--) cout << 'B';
}
else {
int AA = K / B, BB = K % B;
int aa = A - AA - 1, bb = B - BB;
while (AA--) cout << 'A';
while (bb--) cout << 'B';
cout << 'A';
while (BB--) cout << 'B';
while (aa--) cout << 'A';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1695 // C++] 팰린드롬 만들기 (0) | 2021.08.21 |
---|---|
[BOJ 2482 // C++] 색상환 (0) | 2021.08.20 |
[BOJ 1956 // C++] 운동 (0) | 2021.08.18 |
[BOJ 1990 // C++] 소수인팰린드롬 (0) | 2021.08.17 |
[BOJ 1969 // C++] DNA (0) | 2021.08.16 |