Algorithm/Programmers

[Level 1][C] 2016년

현식 :) 2020. 3. 26. 21:07
  • 문제

    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월이나 45일 등의 날짜는 주어지지 않습니다.)
  • Example

    Input 1 : a = 5, b = 24
    Output 1 : "TUE"
  • Code

    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    
    char* solution(int a, int b) {
        int temp=4;                                                    // 정수형 변수 temp 선언 및 대입. 요일 계산 위해 선언
        char weekday[] = {'S','U','N','M','O','N','T','U','E',
                          'W','E','D','T','H','U','F','R','I',
                          'S','A','T'};                                // 문자형 배열 weekday에 요일의 각 문자 대입
    
        char* answer = (char*)malloc(sizeof(char)*4);                  // answer에 char size * 4 만큼의 메모리 동적 할당
    
        if(a<=2) {                                                     // a가 2 이하이고
            if(a==1){                                                  // a가 1이면
                temp=temp+b;                                           // temp는 temp + 4
            }
            else {                                                     // a가 2이면
                temp=temp+31+b;                                        // temp는 temp + 31 + b;
            }
        }
        else if(a>=3&&a<=7) {                                          // a가 3 이상이고 7 이하이고
            if(a%2==0){                                                // a가 짝수이면
                temp=temp+(a-1)*31-(a/2)+b;                            // temp=temp+(a-1)*31-(a/2)+b
            }
            else {                                                     // a가 홀수이면
                temp=temp+(a-1)*31-(a/2+1)+b;                          // temp=temp+(a-1)*31-(a/2+1)+b
            }
        }
        else {                                                         // a가 8이상이면
            temp=temp+(a-1)*31-a/2+b;                                  // temp=temp+(a-1)*31-a/2+b
        }
        temp=temp%7;                                                   // temp 는 temp를 7로 나눈 나머지. 요일 판단
        for(int i=0;i<3;i++) {                                         // 3만큼 반복
            answer[i] = weekday[i+temp*3];                             // answer에 weekday[i+temp*3]부터 3칸 대입
        }
        answer[3]='\0';                                                // answer의 마지막에 NULL 문자 대입
        return answer;                                                 // answer 반환
    }
  • Other Code

    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    
    char* solution(int a, int b) {
        char* WEEK[7] = {"THU","FRI","SAT","SUN","MON","TUE","WED"};   // 문자열 포인터 WEEK 선언 및 각 요일 대입
        int MONTH[12] = {31,29,31,30,31,30,31,31,30,31,30,31};         // 정수형 배열 MONTH 선언 및 각 월의 날짜 대입
        int count_MONTH = 0;                                           // 정수형 변수 count_MONTH 선언 및 초기화
        for(int i=0;i<a-1;i++){                                        // a-1 만큼 반복
            count_MONTH += MONTH[i];                                   // count_MONTH 에 각 월의 날짜 add
        }
        count_MONTH+=b;                                                // count_MONTH 에 b 대입
        char* answer = (char*)malloc(sizeof(char)*3);                  // answer에 char size * 3 만큼의 메모리 동적 할당
        answer = WEEK[count_MONTH%7];                                  // answer에 WEEK[count_MONTH % 7] 대입 ( 해당 요일 )
        return answer;                                                 // answer 반환
    }