화폐 단위 급여 계산기

  • 4 minutes to read

문제 설명:

A 상사는 사원들의 급여를 지급할 때, 필요한 화폐의 종류별 매수를 계산하여 출력하려고 합니다. 다음 입력 형식과 처리 조건 그리고 출력 예시를 사용하여 프로그램을 작성하세요.

입력 형식:

  • 프로그램은 사용자 입력을 받지 않습니다. 대신, Employee 구조체 배열에 미리 정보를 초기화하여 사용합니다.
  • 화폐 단위: 50000 10000 5000 1000 500 100 50 10 5 1

처리 조건:

  1. 초과수당은 시간당 5000원입니다. 40시간 초과시 1.5배를 지급합니다.
  2. 총급여 = 기본급 + 초과수당
  3. 세율은 총급여가 40만원 이상일 경우 12%, 그렇지 않을 경우 10%로 계산합니다.
  4. 수령액 = 총급여 - 세금

출력 예시:

                월급여 명세서
번호    이름    기본급  수당    총급여  세금    수령액
1        철수   450000  330000  780000  93600   686400
2        영희   390000  175000  565000  67800   497200
3        병욱   520000  315000  835000  100200  734800
4        지민   510000  195000  705000  84600   620400
5        수진   335000  352500  687500  82500   605000
합계            -       -       3572500 428700  3143800

     50000 원권 = 62 장
     10000 원권 =  4 장
      5000 원권 =  0 장
      1000 원권 =  3 장
       500 원권 =  1 장
       100 원권 =  3 장
        50 원권 =  0 장
        10 원권 =  0 장
         5 원권 =  0 장
         1 원권 =  0 장

정답:

코드: salary_calculator.c

#include <stdio.h>

// 상수 정의
#define N 5                      // 처리할 직원 수
#define OVERTIME_THRESHOLD 40    // 초과 근무 시간 기준 (이 시간을 초과할 경우 초과수당 적용)
#define OVERTIME_RATE 1.5        // 초과 근무 수당 비율 (기본 시급에 대한 비율로 계산됨)
#define STANDARD_PAY_PER_HOUR 5000  // 기본 시급
#define HIGH_TAX_RATE 0.12       // 높은 세율 (총 급여가 특정 임계값을 초과할 경우 적용됨)
#define LOW_TAX_RATE 0.1         // 낮은 세율 (총 급여가 특정 임계값 이하일 경우 적용됨)
#define HIGH_TAX_THRESHOLD 400000  // 높은 세율이 적용되는 급여 임계값

// 직원 정보를 담을 구조체 정의
typedef struct
{
    char name[6];        // 직원 이름
    long basicSalary;    // 기본급
    int overtimeHours;   // 초과 근무 시간
} Employee;

// 월급여 명세서를 출력하는 함수 선언
void printSalaryDetails(const Employee employees[], int count);

int main(void)
{
    // 직원 정보 초기화
    Employee employees[N] =
    {
        { "철수", 450000, 44 },
        { "영희", 390000, 35 },
        { "병욱", 520000, 42 },
        { "지민", 510000, 39 },
        { "수진", 335000, 47 }
    };

    // 월급여 명세서 출력
    printSalaryDetails(employees, N);

    return 0;
}

void printSalaryDetails(const Employee employees[], int count)
{
    static long currencyUnits[10] = { 50000, 10000, 5000, 1000, 500, 100, 50, 10, 5, 1 }; // 화폐 단위 배열
    long totalSalary = 0, totalTax = 0, totalTakeHome = 0; // 총급여, 총세금, 총수령액 초기화

    printf("\t\t월급여 명세서\n");
    printf("번호\t이름\t기본급\t수당\t총급여\t세금\t수령액\n");

    for (int i = 0; i < count; i++)
    {
        // 초과수당 계산
        long overtimePay = (employees[i].overtimeHours > OVERTIME_THRESHOLD)
            ? (long)employees[i].overtimeHours * STANDARD_PAY_PER_HOUR * OVERTIME_RATE
            : (long)employees[i].overtimeHours * STANDARD_PAY_PER_HOUR;

        long totalEarnings = employees[i].basicSalary + overtimePay; // 총 급여
        float taxRate = (totalEarnings >= HIGH_TAX_THRESHOLD) ? HIGH_TAX_RATE : LOW_TAX_RATE; // 세율 결정
        long tax = totalEarnings * taxRate; // 세금 계산
        long takeHome = totalEarnings - tax; // 수령액 계산

        printf("%d\t%5s\t%ld\t%ld\t%ld\t%ld\t%ld\n", i + 1, employees[i].name, employees[i].basicSalary, overtimePay, totalEarnings, tax, takeHome);

        // 합계 계산
        totalSalary += totalEarnings;
        totalTax += tax;
        totalTakeHome += takeHome;
    }

    // 합계 출력
    printf("합계\t\t-\t-\t%ld\t%ld\t%ld\n\n", totalSalary, totalTax, totalTakeHome);

    // 화폐별 매수 출력
    for (int i = 0; i < 10; i++)
    {
        int notes = totalTakeHome / currencyUnits[i];
        printf("%10ld 원권 = %2d 장\n", currencyUnits[i], notes);
        totalTakeHome %= currencyUnits[i];
    }
}
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com