smooth waters run deep

1d-1c/Programmers

Level1_2016년 (JAVA)

yeon_11 2020. 12. 14. 21:56
 

코딩테스트 연습 - 2016년

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까

programmers.co.kr

 

직접 구현
class Solution {
    public String solution(int a, int b) {
        int[] month = {31,29,31,30,31,30,31,31,30,31,30,31}; //1~12월 일수
        String[] day = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
        int[] calendar = new int[366]; //2016년의 365일의 '요일' 저장
        
        for(int i=0; i<calendar.length; i++){
            calendar[i] = (i+5)%7; // 1/1=금요일=day[5]
        }
        
        int today = 0;
        for(int i=0; i<a-1; i++){
            today += month[i];
        }
        today += b-1;
        
        return day[calendar[today]];
    }
}

1~(a-1)월까지의 일 수 + b일 을 계산하여, a월b일까지의 총 일 수를 구한다.

2016년 1월1일이 금요일이므로, 이를 통해 1월1일부터 n일이 지난 후에는 무슨 요일인지를 출력한다.

 

1. 1~12월 각각의 일 수를 저장한 배열을 이용한다. (month[])

 

2. calendar[] 배열을 통해 총 365일의 '요일'을 나타내는 숫자를 저장한다. (0:일,1:월, ... 7:토)

   이를 계산하기 위해, 2016년 1월 1일이 금요일(=5)임을 이용한다.

   1월1일=금요일=5='0번째 날' 로 표현하면, i번째 날은 (i+5)%7 로 표현할 수 있다.

 

3. 1월1일부터 a월b일까지의 총 일 수를 계산하는 것은, a월b일이 n번째 날이라는 걸 의미한다.

     따라서 calendar[n번째날]의 값을 통해 무슨 요일인지를 알 수 있다.

 

 

Calendar 클래스 이용
import java.util.Calendar;

class Solution {
    public String solution(int a, int b) {
        String answer="";
        
        try{
            Calendar cal = Calendar.getInstance();
            cal.set(2016, a-1, b); //1월=0
            
            String[] week = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
            
            answer = week[cal.get(Calendar.DAY_OF_WEEK)-1]; //일요일=1
        }
        catch(Exception e){
            e.printStackTrace();
        }
        
        return answer;
    }
}

이 문제는 진짜 2016년 1월 1일이 금요일이다.

그래서 Calendar 클래스를 이용해 진짜 날짜의 요일을 구하면 되는 문제였다.

하지만! 진짜 날짜가 아닌, 문제에서 임의로 정한 날짜라면 사용 못하는 방법이다.