티스토리 뷰

https://www.acmicpc.net/problem/12970

 

12970번: AB

첫째 줄에 문제의 조건을 만족하는 문자열 S를 출력한다. 가능한 S가 여러 가지라면, 아무거나 출력한다. 만약, 그러한 S가 존재하지 않는 경우에는 -1을 출력한다.

www.acmicpc.net

백트랙킹으로 접근했을 때, 메모리/시간 모두 간신히 통과했던 문제입니다.

 

새로운 방식의 풀이에

- A의 갯수 + B의 갯수 = 전체 문자열의 길이 N

- 만들어야 하는 쌍의 갯수 K의 범위 : 0 ~ (A의 갯수)x(B의 갯수) 

위 두 가지 성질을 이용해 그리디 기법으로 접근하여 적은 메모리와 빠른 시간에 문제를 해결할 수 있었습니다.


C++ 소스 코드

#include <iostream>
#include <vector>
using namespace std;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,k;
    cin >> n >> k;
    for(int a=0;a<=n;a++){
        //a의 갯수 0~N개 for 문
        int b= n-a; // a+b = N
        // 가능한 쌍의 범위 : 0<= K <= a*b
        if (a*b < k) continue;
        //b의 왼쪽 끝부터 오른쪽 끝까지 
        vector<int> cnt(b+1);
        for(int i=0;i<a;i++){
            int x = min(b,k);
            cnt[x]+=1;
            // x 위치에 a를 한개 추가할 때마다 x개의 쌍이 생김
            k-=x;
        }
        for(int i=b;i>=0;i--){
            for(int j=0;j<cnt[i];j++){
                //현재 위치에 A부터 채워나감
                cout  << 'A';
            }
            if (i>0){
                cout << 'B';
            }
        }
        cout << '\n';
        return 0;
    }
    cout << -1 << '\n';
    return 0;
}

'Algorithm > 알고리즘 문제풀이' 카테고리의 다른 글

BOJ) 12904 - A와 B  (0) 2020.06.24
BOJ) 10986 - 나머지 합  (0) 2020.06.23
프로그래머스) Lv4 - 지형 이동  (0) 2020.06.19
BOJ) 2008 - 사다리 게임  (0) 2020.06.18
프로그래머스) Lv2 - 기능개발  (0) 2020.06.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함