본문 바로가기

개발 언어 및 알고리즘 기초/C언어로 푸는 백준

[백준 10699번/C언어] 오늘 날짜 풀이

백준 10699번 문제를 풀어보았습니다. 

백준 10699번: https://www.acmicpc.net/problem/10699

 

10699번: 오늘 날짜

서울의 오늘 날짜를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

 

 

문제 내용은 아래와 같습니다. 

 

 

 

 

이 문제는 알고리즘 문제라기보다는 <time.h> 헤더를 익히는 문제라고 생각하시면 됩니다. 저도 사용해 본 적이 없어서 이번 기회에 검색해 보며 공부를 해봤습니다. 제가 참고한 블로그 글은 아래와 같습니다. 잘 설명되어 있으니, 이것만 잘 안다면 어려운 부분은 딱히 없습니다. 

https://dev-astra.tistory.com/182

 

[C/C++] 현재 날짜/시간 원하는 형태로 출력하기

현재 날짜/시간 원하는 형태로 출력하기 ① 헤더 불러오기 C #include C++ #include ② time() 함수를 호출하여 현재의 날짜/시간 얻기 time_t timer = time(NULL); time 함수는 time_t 타입을 결과값으로 반환한다.

dev-astra.tistory.com

 

 

 

함수는 총 2개를 사용했는데, makeForm() 함수는 <time.h> 헤더를 이용하여 얻은 정보를 문제에서 원하는 형태로 바꿔주는 함수이고, 다른 모든 필요한 부분은 메인 함수에서 구현했습니다. 

 

 메인 함수를 먼저 살펴보면, time_t 타입을 반환하는 time 함수를 이용하여 현재의 날짜와 시간을 얻습니다. 그리고 localtime 함수를 통해 이 포맷을 사용하기 편하게 변환합니다. struct tm은 각종 정보를 int 타입으로 저장하고 있습니다. 우리는 여기서 우리가 필요한 정보인 연도(tm_year), 월(tm_mon), 일(tm_mday)을 사용할 것입니다.

 하지만 이를 문제에서 요구한 형태로 출력하기 위해서는 약간의 조정이 필요합니다. 우선 tm_year의 경우, 연도 정보를 우리가 아는 형태로 담고 있는 것이 아니라 1900년부터의 년을 담고 있습니다. 따라서 우리는 tm_year 정보에 1900을 더해줘야 적절한 연도 정보를 얻을 수 있습니다. tm_mon의 경우에도 0부터 11까지의 값으로 월 정보를 표시하기 때문에 1을 더해줘야 적절한 월 정보를 알 수 있습니다. 또한, 월과 일의 경우는 문제에서 제시된 대로, 한자리 수일 경우에는 0을 앞에 붙여 01, 02, ... 와 같이 출력해줘야 하기 때문에, 이를 위해서 makeForm() 함수를 사용했습니다.

 makeForm() 함수를 이용해 월과 일 정보를 형식에 맞는 문자열로 변환해주고, 이를 다시 dash를 사용한 형식에 맞춰 출력해 주면 문제에서 요구하는 출력이 완성됩니다. 이후 할당된 메모리를 해제해 주면 main 함수가 완성됩니다.

 

 그렇다면 makeForm() 함수에 대해서 설명해보겠습니다. 우선 data라는 int 타입 인자를 받는데, 이는 우리가 받은 월과 일 정보를 int 형태로 전달해 줍니다. 해당 정보를 받아서 크기가 3인 문자열 하나를 생성해 주고 끝자리에는 null character를 먼저 넣어줍니다. 그 후 수가 한 자릿수이면 0을 앞에 넣어주고, 두 자릿수라면 각각의 자리를 위치에 맡게 문자로 변환하여 넣어줍니다. 월과 일 정보는 세 자릿수가 존재할 수 없으므로, 두 자릿수까지만 처리해 주면 됩니다. 만들어진 문자열을 리턴해주면 정보를 우리가 원하는 형식으로 변환해 주는 과정이 완성됩니다. 

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

char *makeForm(int data) {
    char *dest = (char *)malloc(sizeof(int) * 3);
    if (dest == NULL)
        return NULL;
    
    dest[2] = 0;
    if (data < 10) {
        dest[0] = '0';
        dest[1] = data + '0';
    } else {
        dest[0] = data / 10 + '0';
        dest[1] = data % 10 + '0';
    }
    return dest;
}

int main() {
    time_t time_elem = time(NULL);	// 현재 날짜&시간 얻기
    struct tm *t = localtime(&time_elem);	// 포멧 변환
    
    t->tm_year += 1900;	// 우리가 아는 형태의 연도로 변경
    char *strMon = makeForm(t->tm_mon + 1);	// 월 정보를 담은 int 값을 문제에서 주어진 형태의 string으로 만들기
    char *strDay = makeForm(t->tm_mday);    // 일 정보를 담은 int 값을 문제에서 주어진 형태의 string으로 만들기
    if (strMon == NULL || strDay == NULL) return 1;	// malloc check

    printf("%d-%s-%s", t->tm_year, strMon, strDay);
    
    free(strMon);
    free(strDay);
}
728x90