본문 바로가기
알고리즘

[백준] 14243 출근기록2 (C++)

by kigo23 2023. 5. 15.
반응형

문제 링크 : https://www.acmicpc.net/problem/14243

 

14243번: 출근 기록 2

스타트링크에는 세명의 직원이 일을 하고 있다. 세 직원의 이름은 강호(A), 준규(B), 수빈(C) 이다. 이 회사의 직원은 특별한 룰을 가지고 있는데, 바로 하루에 한 명만 출근한다는 것이다. 3일간의

www.acmicpc.net

 

조건에 맞게 정렬하여 출력하면 되는 문제이다.

A는 언제든, B는 2번 중 1번, C는 3번 중 1번만 출력할 수 있다.

B가 출력될 수 있는 최악의 경우는 B-1 ==  A+C 일 때이다.

C가 출력될 수 있는 최악의 경우는 2*(C-1) == A+B 이다. 각각 B, C로 시작하여 B, C로 끝나는 경우이다.

이 경우를 제외하고는 C > B > A 순서로 출력하며 개수를 줄여간다.

위 조건에 해당되지 않는 상황이 발생하면 -1을 출력해준다.

 

#include <iostream>

using namespace std;

int A = 0, B = 0, C = 0, num;

int main() {    

    string s;
    cin >> s;
    int prev = 0, prev2 = 0;
    char answer[100000];

    num = s.size();

    for(int i=0; i<num; i++){
        if(s[i] == 'A'){
            A++;
        }else if(s[i] == 'B'){
            B++;
        }else{
            C++;
        }
    }
    
    for(int i=0; i<num; i++){
        if(B-1==A+C && prev != 1 && B>0){
            answer[i]= 'B';
            prev2 = prev;
            prev = 1;
            B--;
        }else if(2*(C-1)==A+B && prev != 2 && prev2 != 2 && C>0){
            answer[i]= 'C';
            prev2 = prev;
            prev = 2;
            C--;
        }else{
            if(C>0 && prev != 2 && prev2 != 2){
                answer[i]= 'C';
                prev2 = prev;
                prev = 2;
                C--;
            }else if(B>0 && prev != 1){
                answer[i]= 'B';
                prev2 = prev;
                prev = 1;
                B--;
            }else if(A>0){
                answer[i]= 'A';
                prev2 = prev;
                prev = 0;
                A--;
            }else{
                cout << -1;
                return 0;
                break;
            }
        }
    }

    for(int i=0; i<num; i++){
        cout << answer[i];
    }


    return 0;
}