[잡다 데브 튜토리얼] 주말 총 며칠인지 구하기

choon·2023년 12월 8일
0

코딩테스트 연습

목록 보기
1/4

잡다 개발 구현 능력 검사

1단계 주말이 총 며칠인지 구하기

import datetime

def solution(start_day):
    rest_days = 0
    current_day = start_day

    for month in range(1, 13):
        for day in range(1, 32):
            try:
                date = datetime.date(2023, month, day)

                if date.weekday() in [5, 6]:
                    rest_days += 1

                current_day = (current_day % 7) + 1
            except ValueError:
                pass

    return rest_days

start_day = int(input())

total_rest_days = solution(start_day)

print(total_rest_days)

런타임 에러

ValueError: invalid literal for int() with base 10: ''

이유 찾는 중.. 다른 컴파일러에선 정상작동하는데..

해결방법

if __name__ == "__main__":
    start_day = int(input())
    total_rest_days = solution(start_day)
    print(total_rest_days)

if name == "main":을 써야되네? 이유는?

최종 코드

def solution(start_day):
    rest_days = 0
    current_day = start_day

    for month in range(1, 13):
        if month in [1,3,5,7,8,10,12]:
            days = 31
        elif month in [4,6,9,11]:
            days = 30
        else :
            days = 28

        for day in range(1, days + 1):
            if current_day in [6, 7]:
                rest_days += 1

            current_day = (current_day % 7) + 1

    return rest_days

if __name__ == "__main__":
    start_day = int(input())
    total_rest_days = solution(start_day)
    print(total_rest_days)

2단계 공휴일 추가 입력시

import datetime

def count_rest_days(start_day, holidays):
    rest_days = 0
    current_day = start_day

    for month in range(1, 13):
        for day in range(1, 32):
            try:
                # 날짜 생성
                date = datetime.date(2023, month, day)
                
                # 주말 체크 (토요일 또는 일요일)
                if date.weekday() in [5, 6]:  # 토요일(5) 또는 일요일(6)인 경우
                    rest_days += 1
                
                # 공휴일 체크
                if [month, day] in holidays:
                    rest_days += 1

                # 다음 날로 업데이트
                current_day = (current_day % 7) + 1
            except ValueError:
                # 해당 날짜가 존재하지 않는 경우 (예: 4월 31일)
                pass

    return rest_days

# 입력
start_day = int(input("1월 1일의 요일을 입력하세요 (1=월, 2=화, ..., 7=일): "))
holidays = []

holiday_input = input("공휴일을 입력하세요 (예: [[1,2],[2,3]]): ")
if holiday_input.strip() != "":
    holidays = eval(holiday_input)

# 총 쉬는 날 계산
total_rest_days = count_rest_days(start_day, holidays)

print("총 쉬는 날 수:", total_rest_days)

해결 코드

def solution(start_day, holiday):
    rest_days = 0
    current_day = start_day

    weekend = []

    for month in range(1, 13):
        if month in [1,3,5,7,8,10,12]:
            days = 31
        elif month in [4,6,9,11]:
            days = 30
        else :
            days = 28

        for day in range(1, days + 1):
            if current_day in [6, 7]:
                rest_days += 1
                weekend.append([month, day])

            current_day = (current_day % 7) + 1
    
    holiday_not_weekend = [element for element in holiday if element in weekend]
    real_holiday = len(holiday)-len(holiday_not_weekend)
    rest_days += real_holiday

    return rest_days

if __name__ == "__main__":
    start_day = int(input())
    
    holiday = eval(input())

    total_rest_days = solution(start_day, holiday)
    print(total_rest_days)

3단계 임시공휴일

공휴일이 토요일일때 금요일을 임시공휴일로, 금요일도 공휴일일땐 가장가까운 요일을 임시공휴일로
공휴일이 일요일일때 월요일을 ...
but 만약 올 해 이전이거나 넘어갈 시 추가 안함 (구현못함)

def solution(start_day, holiday):
    rest_days = 0
    current_day = start_day

    weekend = []
    saturday = []
    sunday = []
    friday = []
    monday = []

    for month in range(1, 13):
        if month in [1,3,5,7,8,10,12]:
            days = 31
        elif month in [4,6,9,11]:
            days = 30
        else :
            days = 28

        for day in range(1, days + 1):
            if current_day == 6:
                rest_days += 1
                weekend.append([month, day])
                saturday.append([month,day])
                friday.append([month,day-1])
                
            elif current_day == 7 :
                rest_days += 1
                weekend.append([month, day])
                sunday.append([month,day])
                monday.append([month,day+1])

            current_day = (current_day % 7) + 1
    
    holiday_in_weekend = [element for element in holiday if element in weekend]
    holiday_not_weekend = len(holiday)-len(holiday_in_weekend)
    rest_days += holiday_not_weekend

    for i in range(len(holiday_in_weekend)):
        if holiday_in_weekend[i] in saturday:
            if [holiday_in_weekend[i][0],holiday_in_weekend[i][1]-1] in friday:
                rest_days += 1
                
        elif holiday_in_weekend[i] in sunday:
            if [holiday_in_weekend[i][0],holiday_in_weekend[i][1]+1] in monday:
                rest_days += 1

        

    return rest_days

if __name__ == "__main__":
    start_day = int(input())
    
    holiday = eval(input())

    total_rest_days = solution(start_day, holiday)
    print(total_rest_days)

정답

import ast #ast.literal_eval()

def solution(X, H):
    monday = 1
    tuesday = 2
    wendsday = 3
    thursday = 4
    friday = 5
    saturday = 6
    sunday = 7

    restday = 0
    date_saturday = []
    date_sunday = []
    
    date_friday_front = []
    date_monday_back = []

    for month in range(1,13):
        if month in [1,3,5, 7, 8, 10, 12]:
            days = 31
        elif month in [4,6,9,11]:
            days = 30
        else : #2
            days =28
        
        for day in range(1, days+1):

            calc_week = X % 7

            #saturday calc
            if calc_week == saturday :
                restday += 1
                X += 1
                date_saturday.append([month, day])

                #firday calc
                if day == 1:
                    if month == 3: 
                        days = 28
                    elif month in [2, 4, 6, 8, 9, 11]:
                        days = 31
                    elif month in [5, 7, 10, 12]:
                        days = 30
                    else : #1
                        pass
                    date_friday_front.append([month-1, days])

                else :
                    date_friday_front.append([month, day-1])

            #sunday calc
            elif calc_week == 0 :
                restday += 1
                X += 1
                date_sunday.append([month, day])

                #monday calc
                if day == days:
                    if month == 12: 
                        pass
                    else :
                        date_monday_back.append([month+1, 1])

                else :
                    date_monday_back.append([month, day+1])

            #day count
            else :
                X += 1

    date_holiday = []
    for i in range(len(H)):
        if H[i] in date_saturday:
            if [H[i][0], H[i][1]] in date_friday_front:
                if [H[i][0], H[i][1]] == [1,1]:
                    pass
                else:
                    restday += 1
            else:
                restday += 1
        
        elif H[i] in date_sunday:
            if [H[i][0], H[i][1]] in date_monday_back:
                if [H[i][0], H[i][1]] == [12,31]:
                    pass
                else:
                    restday += 1
            else:
                restday += 1
            
        else:
            restday += 1
            date_holiday.append([month, day])

    return restday

if __name__ == "__main__":
    X = int(input())
    H = ast.linear_eval(input())
    print(solution(X,H))

0개의 댓글