본문 바로가기

개발(합니다)/알고리즘&코테

알고리즘 단계별로 풀어보기 : BOJ-1924(2007년)

반응형

문제(출처)

오늘은 2007년 1월 1일 월요일이다. 

그렇다면 2007년 x월 y일은 무슨 요일일까? 

이를 알아내는 프로그램을 작성하시오.


입력

첫째 줄에 빈 칸을 사이에 두고 x(1≤x≤12)와 y(1≤y≤31)이 주어진다. 

참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.


출력

첫째 줄에 x월 y일이 무슨 요일인지에 따라 SUN, MON, TUE, WED, THU, FRI, SAT중 하나를 출력한다.


예제 입력1

1 1


예제 출력1

MON


예제 입력2

3 14


예제 출력2

WED



내 풀이

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.time.temporal.WeekFields;

public class Main {
    public enum week {
        SUN, MON, TUE, WED, THU, FRI, SAT
    }
    public static void main(String args[]) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//      1, 3, 5, 7, 8, 10, 12 : 31일까지
//      4, 6, 9, 11 : 30일까지
//      2 : 28일까지
        try {
            String[] str = br.readLine().split(" ");
            int month = Integer.parseInt(str[0]);
            int day = Integer.parseInt(str[1]);
            int result = 0;
            for (int i = 1; i < month; i++) {
                result += countMonthDay(i);
            }
            result += day;
            result = result % 7;
            switch (result) {
            case 0:
                bw.write(String.valueOf(week.SUN));
                break;
            case 1:
                bw.write(String.valueOf(week.MON));
                break;
            case 2:
                bw.write(String.valueOf(week.TUE));
                break;
            case 3:
                bw.write(String.valueOf(week.WED));
                break;
            case 4:
                bw.write(String.valueOf(week.THU));
                break;
            case 5:
                bw.write(String.valueOf(week.FRI));
                break;
            case 6:
                bw.write(String.valueOf(week.SAT));
                break;
            }
            bw.flush();
            bw.close();
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static int countMonthDay(int month) {
        int count = 0;
        switch (month) {
        case 1:
            count += 31;
            break;
        case 3:
            count += 31;
            break;
        case 5:
            count += 31;
            break;
        case 7:
            count += 31;
            break;
        case 8:
            count += 31;
            break;
        case 10:
            count += 31;
            break;
        case 12:
            count += 31;
            break;
        case 4:
            count += 30;
            break;
        case 6:
            count += 30;
            break;
        case 9:
            count += 30;
            break;
        case 11:
            count += 30;
            break;
        case 2:
            count += 28;
            break;
        default:
        }
        return count;
    }
}



내 풀이 해석

enum을 사용해서 표현해보려고 enum을 찾아보는 시간도 있었지만 오래걸렸습니다.(60분)
반복문을 적게 쓰려고 했습니다.
2007년 1년을 기준으로 문제를 풀었고 다른년에는 적용이 안됩니다.
입력 받은 Month까지 일수를 더하고 Day를 더한 다음 7로 나눈 나머지를 가지고 요일을 출력합니다.
1주일은 7일이므로 요일의 나머지는 항상 같습니다.


아쉬운 점

손으로 규칙을 찾고 시간이 오래 걸립다.
스터디를 하면 좀 더 나을까 고민하게 됩니다.
enum을 제대로 사용하지 못했습니다.
자바를 다시 공부해야 하나 생각이 듭니다.


반응형