[백준] 2529번 부등호 (= inequality sign) - 재우스 프로그래밍 (C 언어)

2021. 2. 28. 17:04백준

문제 링크 :www.acmicpc.net/problem/2529

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

char *maxComb(const char *, int);
char *minComb(const char *, int);
void swap(char *, char *);

int main(void)
{
    char *A;
    int a = 0;    //입력 받을 문자열 A의 크기

    scanf("%d", &a);
    getchar();    //위의 scanf에서 입력받고 입력버퍼에 남아있는 \n 제거
    A = (char *)malloc(sizeof(char) * (a + 1));    //'\0' 저장 위해 크기 a + 1

    //부등호 입력 받기
    for (int i = 0; i < a; i++) {
        A[i] = getchar();
        getchar();
    }
    A[a] = '\0';    //문자열로 저장해놓기 위해 마지막에 \0 저장

    printf("%s\n", maxComb(A, a));
    printf("%s\n", minComb(A, a));

    free(A);
    return 0;
}

char *maxComb(const char *A, int a)
{
    char *result = (char *)calloc(a + 2, sizeof(char));    //'\0'저장 + 0부터 a까지 저장하기 위해 크기 1 + (a + 1)
    int right, left;

    result[0] = '9';    //제일 앞에 먼저 max저장
    for (int i = 0; i < a; i++) {
        right = i + 1;    //부등호 오른쪽
        left = i;        //부등호 왼쪽
        result[right] = (char)(9 - right + 48);    //그 다음 최댓값 저장

        if (A[i] == '<') {
            do {
                //부등호 양쪽 교환
                swap(&result[left--], &result[right--]);
            //부등호가 > 나올 때까지 계속 교환
            } while (left >= 0 && A[left] == '<');
        }
    }
    //결과를 출력하기 위해 마지막에 \0 저장
    result[a + 1] = '\0';

    return result;
}
char *minComb(const char *A, int a)
{
    char *result = (char *)calloc(a + 2, sizeof(char));    //'\0'저장 + 0부터 a까지 저장하기 위해 크기 1 + (a + 1)
    int right, left;

    result[0] = '0';    //제일 앞에 먼저 min저장
    for (int i = 0; i < a; i++) {
        right = i + 1;    //부등호 오른쪽
        left = i;        //부등호 왼쪽
        result[right] = (char)(right + 48);    //그 다음 최솟값 저장

        if (A[i] == '>') {
            do {
                //부등호 양쪽 교환
                swap(&result[left--], &result[right--]);
            //부등호가 < 나올 때까지 계속 교환
            } while (left >= 0 && A[left] == '>');
        }
    }
    //결과를 출력하기 위해 마지막에 \0 저장
    result[a + 1] = '\0';

    return result;
}
void swap(char *left, char *right)
{
    char temp;
    temp = *left;
    *left = *right;
    *right = temp;
    return;
}