https://www.acmicpc.net/problem/1924

 

이전 백준문제는 랜덤으로 뽑았지만 이번은 이전에 풀다 그만둔 문제를 가져왔다

아마 c++연습할때 풀어볼까 해서 잡았던게 아닐까 싶은데 왜 맞출때까지 수정안했는지 모르겠다

 

문제는 2007년의 특정 일자의 요일을 알아내는 문제인데

1월1일은 월요일이다 라는 단서로 계속 7단위로 나머지를 구하면 되겠구나 싶었다

그래서 대충 순서를 

1. 입력을받고

2. 7로 나눌 일자를 구하고 (그냥 day1을 월요일로 잡고  몇월인지 상관없이 일수로만 7로 나눠서 구할 생각이였다.)

3. 나온 일자로 요일 문자열을 매칭시키고

4. 출력 따란~

로 잡고 했으나... 뭔가 잘 안됐음

한참을 예시문제를 돌려보다가 내가 반복문 조건을 제시 월부터 뒤로 역순으로 계산하다가 첫달의 값을 계산하면 안됐었는데 그걸 포함시켜버린걸 찾아서.... 

뭐 어처구니없는 실수 때문에 시간을 끄니 학교다닐때 생각도 나고 해서 좀 센티멘탈한 기분으로 마무리를 지었다 아래는 그 소스

#include <stdio.h>
#include <string.h>
/**
 q1924 2007년
 */

void solution(void) {
    // 1. month, day 입력받기 int, int
    int month = 0;
    int day = 0;
    
    scanf("%d %d", &month, &day);
    
    // 2. 입력받은 날짜를 1월 + 지난 일수로 변경
    int temp = 0;
    for (int i = 1; i < month; i++) {
        //  4, 6, 9, 11 월은  30일까지 2월은 28일까지
        switch (i) {
            case 2:
                temp += 28;
                break;
            case 4: case 6: case 9: case 11:
                temp += 30;
                break;
            case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                // 1~12까지만 들어올텐데 굳이 필요없을지도?
                temp += 31;
                break;
            default: break;
        }// switch
    }// for
    
    char result[4] = {};
    
    // 3. 요일 계산 SUN, MON, TUE, WED, THU, FRI, SAT
    int rema = (day+temp) % 7;
    switch (rema) {
        case 0:
            strcpy(result, "SUN");
            break;
        case 1:
            strcpy(result, "MON");
            break;
        case 2:
            strcpy(result, "TUE");
            break;
        case 3:
            strcpy(result, "WED");
            break;
        case 4:
            strcpy(result, "THU");
            break;
        case 5:
            strcpy(result, "FRI");
            break;
        case 6:
            strcpy(result, "SAT");
            break;
        default:
            strcpy(result, "ERR");
            break;
    }
    
    // 4. 출력 형식에 맞춰 출력 딱히 뭐없었네 그냥 출력했어도 됐겠다
    printf("%s\n", result);
    return;
}


int main(int argc, const char * argv[]) {
    solution();
    return 0;
}

 

요일로 매칭시키는 부분을 더 단순히 할 수 있을거 같기도한데 귀찮아져서 나중에 지피티에게 코드리뷰좀 봐줘라고 부탁해봐야겠다

 

 

+ 지피티에게 코드리뷰!

진짜 상당히 짧아졌다

void solution(void) {
    int month, day;
    scanf("%d %d", &month, &day);

    // 2007년의 각 월 일수
    int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    // 시작 요일 배열
    const char *week[7] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};

    int total = 0;
    for (int i = 0; i < month - 1; i++)
        total += daysInMonth[i];

    total += day;

    printf("%s\n", week[total % 7]);
}

int main(int argc, const char * argv[]) {
    solution();
    return 0;
}

미리 일 수나 요일을 작성해 모아두는건 이전에도 교훈을 얻었건만 기억이 안났었다 깔끔해서 좋다

배열 인덱스로 스위치를 대신하는건 예전에도 했던거같은데, 기억이 안나는게 참 많네

 

https://github.com/wiwi-git/c-baekjoon/

 

GitHub - wiwi-git/c-baekjoon: 블로그 업데이트용 백준 코드

블로그 업데이트용 백준 코드. Contribute to wiwi-git/c-baekjoon development by creating an account on GitHub.

github.com

 

 

 

반응형

'C,C++' 카테고리의 다른 글

[C]백준 Q.17427 약수의 합 2  (0) 2025.12.13
[C]백준 Q.1037 약수  (0) 2025.12.12
[C]백준 Q.4375 1  (0) 2025.12.11
[C]백준 Q.2839 설탕 배달  (0) 2025.12.07
[C]백준 Q.17479 재귀함수가 뭔가요?  (0) 2025.12.01

+ Recent posts