๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Lect & Tip

ํŒŒ์ด์ฌ '์—ฐ์ฐจํœด๊ฐ€์ผ์ˆ˜ ๊ณ„์‚ฐ๊ธฐ' ๋งŒ๋“ค๊ธฐ

by st๊ณต๊ฐ„ 2024. 10. 10.

๋ชฉ์ฐจ

    ํŒŒ์ด์ฌ '์—ฐ์ฐจํœด๊ฐ€์ผ์ˆ˜ ๊ณ„์‚ฐ๊ธฐ' ๋งŒ๋“ค๊ธฐ

    ์ง์žฅ์—์„œ ์—ฐ์ฐจ ํœด๊ฐ€๋Š” ์ง์›๋“ค์˜ ์ค‘์š”ํ•œ ๊ถŒ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ์ฐจ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ผ์ด ์ข…์ข… ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๋ณต์žกํ•˜๊ฒŒ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ํŒŒ์ด์ฌ์„ ์‚ฌ์šฉํ•ด ์—ฐ์ฐจํœด๊ฐ€์ผ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” '์—ฐ์ฐจํœด๊ฐ€์ผ์ˆ˜ ๊ณ„์‚ฐ๊ธฐ'๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    ํŒŒ์ด์ฌ '์—ฐ์ฐจํœด๊ฐ€์ผ์ˆ˜ ๊ณ„์‚ฐ๊ธฐ' ๋งŒ๋“ค๊ธฐํŒŒ์ด์ฌ '์—ฐ์ฐจํœด๊ฐ€์ผ์ˆ˜ ๊ณ„์‚ฐ๊ธฐ' ๋งŒ๋“ค๊ธฐ
    ํŒŒ์ด์ฌ '์—ฐ์ฐจํœด๊ฐ€์ผ์ˆ˜ ๊ณ„์‚ฐ๊ธฐ' ๋งŒ๋“ค๊ธฐ

    ์ด ์—ฐ์ฐจํœด๊ฐ€์ผ์ˆ˜ ๊ณ„์‚ฐ๊ธฐ ํ”„๋กœ๊ทธ๋žจ์€ ์ž…์‚ฌ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ์—ฐ์ฐจํœด๊ฐ€๋ฅผ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ๋ณต์žกํ•œ ์ˆ˜์‹์„ ๋Œ€์‹ ํ•ด์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ฝ”๋“œ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•˜๊ณ , ๊ทธ ํ™œ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    ์—ฐ์ฐจํœด๊ฐ€ ๊ณ„์‚ฐ ๊ทœ์น™ ์ดํ•ดํ•˜๊ธฐ

    ๋จผ์ € ์—ฐ์ฐจํœด๊ฐ€ ๊ณ„์‚ฐ์˜ ๊ธฐ๋ณธ ๊ทœ์น™์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ•œ๋ฏผ๊ตญ ๊ทผ๋กœ๊ธฐ์ค€๋ฒ•์— ๋”ฐ๋ฅด๋ฉด ์—ฐ์ฐจํœด๊ฐ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

    • ์ž…์‚ฌ ํ›„ 1๋…„ ๋ฏธ๋งŒ: ๋งค๋‹ฌ ๊ฐœ๊ทผ ์‹œ 1์ผ์˜ ์œ ๊ธ‰ํœด๊ฐ€๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ์ž…์‚ฌ ํ›„ 1๋…„ ์ด์ƒ: 1๋…„ ๋™์•ˆ 80% ์ด์ƒ ์ถœ๊ทผ ์‹œ, ์—ฐ๊ฐ„ 15์ผ์˜ ์—ฐ์ฐจํœด๊ฐ€๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • 3๋…„ ์ด์ƒ ๊ทผ๋ฌด ์‹œ: 2๋…„๋งˆ๋‹ค 1์ผ์”ฉ ์ถ”๊ฐ€ ์—ฐ์ฐจ๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

    ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค.

    ๊ณ„์‚ฐ๊ธฐ ์„ค๊ณ„ ๋ฐ ํŒŒ์ด์ฌ ์ฝ”๋“œ ์ž‘์„ฑ

    ์—ฐ์ฐจํœด๊ฐ€ ๊ณ„์‚ฐ๊ธฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…์‚ฌ์ผ๊ณผ ๊ทผ์†์—ฐ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—ฐ์ฐจํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    from datetime import datetime
    
    def calculate_annual_leave(join_date_str):
        # ์ž…์‚ฌ์ผ ์ž…๋ ฅ ๋ฐ›๊ธฐ
        join_date = datetime.strptime(join_date_str, "%Y-%m-%d")
        today = datetime.today()
    
        # ๊ทผ์†์—ฐ์ˆ˜ ๊ณ„์‚ฐ
        total_days = (today - join_date).days
        years_of_service = total_days // 365
    
        # ์—ฐ์ฐจ ๊ณ„์‚ฐ
        if years_of_service < 1:
            # 1๋…„ ๋ฏธ๋งŒ์ผ ๊ฒฝ์šฐ ๋งค๋‹ฌ ๊ฐœ๊ทผ ์‹œ 1์ผ์”ฉ ๋ถ€์—ฌ
            annual_leave = min(11, total_days // 30)
        else:
            # 1๋…„ ์ด์ƒ์ผ ๊ฒฝ์šฐ ๊ธฐ๋ณธ 15์ผ + 2๋…„๋งˆ๋‹ค 1์ผ ์ถ”๊ฐ€
            annual_leave = 15 + (years_of_service - 1) // 2
    
        return annual_leave
    
    # ์‚ฌ์šฉ์ž ์ž…๋ ฅ
    join_date_str = input("์ž…์‚ฌ์ผ์„ ์ž…๋ ฅํ•˜์„ธ์š” (YYYY-MM-DD): ")
    annual_leave_days = calculate_annual_leave(join_date_str)
    
    print(f"ํ˜„์žฌ๊นŒ์ง€ ๋ฐœ์ƒํ•œ ์—ฐ์ฐจํœด๊ฐ€ ์ผ์ˆ˜: {annual_leave_days}์ผ")

    ์ฝ”๋“œ ์„ค๋ช…

    ์ด์ œ ์œ„ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    1. ์ž…์‚ฌ์ผ ์ž…๋ ฅ ๋ฐ ๊ทผ์†์—ฐ์ˆ˜ ๊ณ„์‚ฐ
      datetime ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ž…์‚ฌ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ํ˜„์žฌ ๋‚ ์งœ๊นŒ์ง€์˜ ์ผ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. total_days ๋ณ€์ˆ˜๋Š” ์ž…์‚ฌ ํ›„ ์ด ๊ทผ์†์ผ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    2. ๊ทผ์†์—ฐ์ˆ˜์— ๋”ฐ๋ฅธ ์—ฐ์ฐจ ๊ณ„์‚ฐ
      years_of_service ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ทผ์†์—ฐ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ , ์ด์— ๋”ฐ๋ผ ์—ฐ์ฐจํœด๊ฐ€๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
      • 1๋…„ ๋ฏธ๋งŒ์˜ ๊ฒฝ์šฐ ๋งค๋‹ฌ ๊ฐœ๊ทผ ์‹œ 1์ผ์˜ ํœด๊ฐ€๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ตœ๋Œ€ ์—ฐ์ฐจ๋Š” 11์ผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
      • 1๋…„ ์ด์ƒ ๊ทผ์†ํ•œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ 15์ผ์˜ ์—ฐ์ฐจ๋ฅผ ๋ถ€์—ฌํ•˜๋ฉฐ, ์ดํ›„ ๋งค 2๋…„๋งˆ๋‹ค 1์ผ์”ฉ ์ถ”๊ฐ€ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
    3. ๊ฒฐ๊ณผ ์ถœ๋ ฅ
      ์ตœ์ข…์ ์œผ๋กœ ๊ณ„์‚ฐ๋œ ์—ฐ์ฐจํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

    ์ฝ”๋“œ ํ™•์žฅ ๋ฐ ๊ฐœ์„  ๋ฐฉ๋ฒ•

    ์ด ๊ธฐ๋ณธ์ ์ธ ์—ฐ์ฐจํœด๊ฐ€ ๊ณ„์‚ฐ๊ธฐ๋ฅผ ๋”์šฑ ํ™•์žฅํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    1. ์ถœ์„๋ฅ  ๋ฐ˜์˜
      ๊ทผ๋กœ๊ธฐ์ค€๋ฒ•์— ๋”ฐ๋ผ 1๋…„ ๋™์•ˆ 80% ์ด์ƒ์˜ ์ถœ๊ทผ์œจ์„ ๋‹ฌ์„ฑํ•ด์•ผ ์—ฐ์ฐจํœด๊ฐ€๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ณ„์‚ฐ๊ธฐ์—์„œ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋„๋ก, ์ถœ๊ทผ์œจ ์ž…๋ ฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    2. ์ง๊ธ‰๋ณ„/๊ทผ๋กœ์กฐ๊ฑด๋ณ„ ๊ทœ์น™ ๋ฐ˜์˜
      ํšŒ์‚ฌ๋งˆ๋‹ค ์—ฐ์ฐจ ๋ถ€์—ฌ ๊ทœ์ •์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณ„์•ฝ์ง, ์ •๊ทœ์ง, ํŒŒํŠธํƒ€์ž„ ๋“ฑ ๊ทผ๋กœ ํ˜•ํƒœ์— ๋”ฐ๋ผ ์—ฐ์ฐจ ๋ถ€์—ฌ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์กฐ๊ฑด๋ฌธ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ทผ๋กœ์กฐ๊ฑด์„ ์ง€์›ํ•˜๋„๋ก ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    3. ๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(GUI) ์ถ”๊ฐ€
      ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•ด tkinter์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GUI๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ํŒŒ์ด์ฌ์„ ์ž˜ ๋ชจ๋ฅด๋Š” ์‚ฌ์šฉ์ž๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์ฐจ ๊ณ„์‚ฐ๊ธฐ๋กœ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉํ•˜๊ธฐ

    ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ์—ฐ์ฐจ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ด์ฌ์˜ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, pandas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€๋Ÿ‰์˜ ์ง์› ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๊ฐ ์ง์›์˜ ์—ฐ์ฐจํœด๊ฐ€๋ฅผ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ณ  ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ธ์‚ฌํŒ€์—์„œ ์—ฌ๋Ÿฌ ์ง์›์˜ ์—ฐ์ฐจ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    import pandas as pd
    from datetime import datetime
    
    # ์ง์› ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ
    data = {
        '์ด๋ฆ„': ['๊น€์ฒ ์ˆ˜', '์ด์˜ํฌ', '๋ฐ•๋ฏผ์ˆ˜'],
        '์ž…์‚ฌ์ผ': ['2021-06-01', '2020-03-15', '2019-11-20']
    }
    
    df = pd.DataFrame(data)
    
    def calculate_leave(join_date_str):
        join_date = datetime.strptime(join_date_str, "%Y-%m-%d")
        today = datetime.today()
        total_days = (today - join_date).days
        years_of_service = total_days // 365
    
        if years_of_service < 1:
            return min(11, total_days // 30)
        else:
            return 15 + (years_of_service - 1) // 2
    
    # ์—ฐ์ฐจ ๊ณ„์‚ฐ
    df['์—ฐ์ฐจํœด๊ฐ€์ผ์ˆ˜'] = df['์ž…์‚ฌ์ผ'].apply(calculate_leave)
    
    print(df)

    ์ด ์ฝ”๋“œ๋Š” ์ง์›๋“ค์˜ ์ž…์‚ฌ์ผ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ์ž์˜ ์—ฐ์ฐจํœด๊ฐ€ ์ผ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ์—… ์ธ์‚ฌ ๋‹ด๋‹น์ž์—๊ฒŒ ํฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ฒฐ๋ก 

    ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํŒŒ์ด์ฌ์„ ํ™œ์šฉํ•œ '์—ฐ์ฐจํœด๊ฐ€์ผ์ˆ˜ ๊ณ„์‚ฐ๊ธฐ'๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์—ฐ์ฐจํœด๊ฐ€ ๊ณ„์‚ฐ์€ ๋ฒ•์  ์š”๊ฑด๊ณผ ํšŒ์‚ฌ์˜ ์ •์ฑ…์„ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ๋ณต์žกํ•œ ๊ณผ์ •์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ํŒŒ์ด์ฌ์„ ํ™œ์šฉํ•˜๋ฉด ์ด๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ pandas ํ™œ์šฉ๊นŒ์ง€, ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฐ์ฐจ ๊ณ„์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    ์ง์žฅ ๋‚ด ํšจ์œจ์„ฑ์„ ๋†’์ด๊ณ , ์ง์›๋“ค์˜ ๊ถŒ๋ฆฌ๋ฅผ ์ •ํ™•ํžˆ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒƒ์€ ๋งค์šฐ ์˜๋ฏธ ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธฐํšŒ์— ํŒŒ์ด์ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์ฐจ ๊ณ„์‚ฐ์„ ์ž๋™ํ™”ํ•ด ๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์—…๋ฌด ํšจ์œจ์„ฑ์ด ํ•œ ๋‹จ๊ณ„ ๋” ์˜ฌ๋ผ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€