[연습문제] 2016년

2024. 10. 27. 18:00입문문제

https://school.programmers.co.kr/learn/courses/30/lessons/12901

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명
2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요?

두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요.

요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT입니다.

예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.


제한 조건
2016년은 윤년입니다.
2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)


입출력 예

a b result
5 24 "TUE"

2016년 1월 1일은 금요일일 때, 2016년 a월 b일은 무슨 요일인지 구하는 문제입니다.

 

실제 2016년 1월 1일은 금요일이므로 파이썬을 사용한다면 weekday 함수를 사용해서 구할 수도 있습니다.

하지만 이전에 파이썬이 없는 코딩테스트를 진행해봤는데, 생각보다 다른 언어 실력이 많이 떨어졌더라고요.

이걸 극복하려면 아무래도 반복밖에 답이 없어서 이제부터라도 파이썬 + C or 자바로 풀어보겠습니다.

 

우선 C언어는 모든 달의 날짜를 기록한 뒤, a달까지의 날짜 + b날까지의 날짜를 더해 총 날짜를 구했습니다.

그 다음, 총 날짜를 7로 나누면 나머지를 통해 일주일 단위로 몇 번째에 해당하는 날짜임을 알 수 있습니다.

 

정답 코드를 작성해보겠습니다.

 

1. C

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

char* solution(int a, int b) {
    int days_in_month[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    char* days_of_week[] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
    int count = 4; // 1월 1일은 금요일이므로 offset을 4으로 시작

    // 월별 일수를 더해서 특정 월까지의 누적 날짜 계산
    for (int i = 0; i < a; i++) {
        count += days_in_month[i];
    }
    count += b; // 일 더하기
    count %= 7; // 요일 계산

    // 요일 문자열을 answer에 복사해서 반환
    char* answer = (char*)malloc(sizeof(char) * 4);
    snprintf(answer, 4, "%s", days_of_week[count]);
    
    return answer;
}

 

2. 파이썬

import datetime as dt
def solution(a, b):
    # 날짜를 설정합니다.
    date = dt.datetime(2016, a, b)
    # 요일이 몇 번째인지 구합니다.
    dayofweek = date.weekday()
    # 요일 문자열 생성 (0 = 월요일, ..., 6 = 일요일)
    days_of_week = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
    # 요일을 구합니다.
    answer = days_of_week[dayofweek]
    return answer

 

C로 풀려니까 잘 안 되네요.