백준

백준 12970 AB

콩순이냉장고 2024. 11. 15. 20:32

문제 URL : https://www.acmicpc.net/problem/12970

 

문제 접근법 : 

처음엔 전수조사해서 풀려고 했으나 2^50 이라 가능할것같지 않아서

수학적으로 접근했습니다.

 

만약 ABBBBABB 가 있따면

뒤에 있는B뒤에있는 B들은 전부 A의 개수만큼 더해줘야하기때문에

01111022 가 되는 구조라

처음부터 n의 길이만큼 B로 설정해줍니다.

그럼 어딘가 k개 이하만큼 A를 잘 설정해줘야하는데

n이 6이라고 가정하고 k에 상관없이

처음 BBBBBB 로시작해

0번째에 A를 놓는다고가정하면

ABBBBB 가 되고 011111 만큼 count하면 5가 되고

중간 아무 위치에 A를 넣을때 어떻게 카운트하냐면

ABABBB일때 010222가 된다면 7이 되는데 A의 인덱스위치에서 n-1-i 만큼 카운트해주고 또 앞에 a가 붙여줌으로서 기존껄 지워줘야하니 a의 개수만큼 지워주면 되기때문에

전체 합이 k이하가 될수있는지만 판단해서 a를 놓으면 되는 알고리즘으로 짰습니다.

 

소스코드:

//By 콩순이냉장고
#include<bits/stdc++.h>
using namespace std;
int n,k;
void input(){
    cin>>n>>k;
}

void solve(){
    string res ="-1";
    string s(n,'B');
    int total = 0;
    int cnt = 0;
    for(int i=0;i<n;i++){
        if(total -1 +n-i-cnt<=k){
            s[i]='A';
            total+=n-i-1-cnt;
            cnt++;
        }
        if(total==k){
            res=s;
            break;
        }
    }
    cout<<res<<"\n";
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    input();
    solve();

}

 

궁금한점 혹은 모르는점 혹은 논리적인 오류등 어떤질문이든 댓글은 언제나 환영입니다.