본문 바로가기
알고리즘/프로그래머스

프로그래머스 2016년, 원하는 특정요일구하기(level.2)

by 코리늬 2018. 2. 14.

문제 : 2016년 1월 1일은 금요일입니다. 2016년 A월 B일은 무슨 요일일까요? 

두 수 A,B를 입력받아 A월 B일이 무슨 요일인지 출력하는 getDayName 함수를 완성하세요. 

요일의 이름은 일요일부터 토요일까지 각각

SUN,MON,TUE,WED,THU,FRI,SAT

를 출력해주면 됩니다. 예를 들어 A=5, B=24가 입력된다면 5월 24일은 화요일이므로 TUE를 반환하면 됩니다.


이 문제의 같은 경우 사람들이 2016년의 각 월이 몇일로 끝나는지 알고있을 때 배열에 각 월의 일수를 넣어서 해당 값을 이용해 연산을 하였다. 하지만, 문제에서 2016년이 윤년인지 각 월이 몇일로 끝나는지 모르기 때문에 이렇게 해서는 안된다는 생각에 윤년구하는 방법과 다른방법을 합해서 정리해보기로 하였다.

자바에서 날짜를 구할 때는 주로 Date, Calendar를 사용한다.

Date의 단점을 해결하고 등장한 것이 Calendar클래스이고, Calendar클래스는 추상클래스이다.

Calendar클래스에 대한 인스턴스를 생성하려면 Calendar가 가지고 있는 클래스 메소드 getInstnace()를 사용해야 한다.

getInstance()메소드를 호출하면 내부적으로 java.util.GregorianCalendar 인스턴스를 만들어서리턴한다.

GregorianCalendar는 Calendar의 자식 클래스이다.


1) 연/월/일을 입력 받는 main() // 값을 입력받았기 때문에 여기서는 Date나 Calendar를 따로 사용하지는 않았다.

2) 구한 요일을 출력하는 PrintDay()

3) 그 달은 총 몇일인지 계산하여 리턴하는 MonthDays()

4) 그 날이 어떤 요일인지 계산하여 'X'요일을 리턴하는 DayofDate() 로 이루어져있다는 것을 알 수 있다.

계산 방법은 기준일자인 2016년 1월 1일 금요일로 부터 입력 받은 날짜까지 총 몇일 지났는지 알아낸다음,

그 날짜를 7로 나눈 나머지에 따라 일/월/화/수/목/금/토 요일을 계산하는 것이다.

일자 계산에는 1/3/5/7/8/10/12 월이라면 31일, 아니라면 30일, 평년 2월달이라면 28일, 윤년 2월달이라면 29일로 조건에 따라 날짜가 들어가도록 했다.





다른방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public String solution(int month, int day){
        String answer="";
        //문제에서 1월 1일이 금요일이라고 주어졌으니 금요일을 기준으로 잡음
        String[] str = { "FRI""SAT""SUN""MON""TUE""WED""THU" };
        int[] date = { 312931303130313130313031 };
        int sumDate = 0;
 
        //해당 월의 전까지의 전체 일수
        for(int i=0; i<month-1; i++){
            sumDate = sumDate + date[i];
        }
 
        //해당 월의 입력 받은 일수만큼 +
        sumDate = sumDate + day - 1;
 
        //일주일로 나눈 나머지를 계산1
        answer = str[sumDate % 7];
        return answer;
    }
cs


댓글