프로그래머스 코딩테스트 연습 : 2016년

728x90

Q. 문제

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년은 윤년입니다. 2월29일 포함 366일
2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

 

> 접근방법 1 (fail)

최근 영화예매 웹 사이트 만들기 (미니) 프로젝트를 진행하면서  OracleDB의 data 함수를 받아와서 JAVA로 처리하면서 다뤘던 date 함수를 이용해보고 싶었다. 

Date date = new Date(); // 현재 날짜 생성
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

int year = 2016;
int month = a;  // 월에 입력되는 파라미터 a
int day = b; // 일에 입력되는 파라미터 b 
String inputdate = year+"-"+a+"-"+b;
        date = sdf.format(inputdate);
        
        ...

 

이런 방식으로 처리해서 date의 요일을 출력하는 메소드(어디서 지나가는 포스팅중에 본 기억이 났다)를 사용하여 처리할려고 하였으나 

format 안의 인자로 Date 타입이 필요한데...  inputdate의 값을 2016-aa-bb 형식으로 유지하면서 타입을 date로 바꿀 방법을 찾지 못하였고, 다른 방법이 필요함을 느꼈다. 

 

> 접근 방법 2

2016년이 윤년인걸 고려하여 각 달의 일수를 array 타입으로 저장한 뒤, 파라미터 a(month) , b(day)에 따라  for 문을 통해 (2016년) 1월 1일 금요일을 기준으로 a월 b일 까지의 일수를 측정하여 7로 나눈 나머지를 조건에 따라 나눠서 a월 b일의 요일을 구할 수 있을 것이다.

가장 쉽게 접근할 수 있는 방법이라 생각했기에 따로 코드를 짜보지는 않았다.

 

> 접근 방법 3  (by. Calendar 클래스)

2의 방법으로 문제를 풀기 싫어서 적절한 API를 찾아보았다.  결론은 Calendar의 get함수를 이용해서 대한 요일을 알 수 있다는 것을 알게 되었고, Calendar 클래스를 이용해서 문제를 풀어보았다.

import java.util.Calendar;
import static java.util.Calendar.*;

    public class Solution {

        public String solution(int a, int b) {

            Calendar cal = Calendar.getInstance();

            cal.set(YEAR, 2016);
            cal.set(MONTH, a - 1);
            cal.set(DATE, b);

            cal.set(HOUR, 0);
            cal.set(MINUTE, 0);
            cal.set(SECOND, 0);
            cal.set(MILLISECOND, 0);  // millisecond 요소를 꼭 0 으로 설정해줘야한다 !

            int daynum = cal.get(DAY_OF_WEEK);
            String kordate = "";

            switch (daynum) {
                case 1:
                    kordate = "SUN";
                    break;
                case 2:
                    kordate = "MON";
                    break;
                case 3:
                    kordate = "TUE";
                    break;
                case 4:
                    kordate = "WEN";
                    break;
                case 5:
                    kordate = "TUR";
                    break;
                case 6:
                    kordate = "FRI";
                    break;
                case 7:
                    kordate = "SAT";
                    break;
                default:
                    kordate = "알수없음";
                    break;
            }

            return kordate;
        }

Calendar의 객체 cal 을 생성한다. (일단 오늘 날짜의 instance를 만든다)

cal의 값을 원하는 값으로 변경한다.  (※ 주의   set 함수를 이용해서 년,월,일 만 변경하면 안된다.  시,분,초 는 물론 millisecond 성분도 초기화 시켜줘야 한다.   코드에서는 0으로 초기화했으나 결과값에 영향이 없으므로 임의의값을 대입해도 상관없을 것 같다)

특정 값을 지정했다면 get함수로 get(DAY_OF_WEEK); 를 사용해서 1 ~ 7 중 한 개의 값을 받을 수 있고,  1 (일요일) 부터 차례대로 2(월요일), 3(화요일) .... 7(토요일) 의 값과 매칭된다. 조건문을 통해서 각 요일에 맞는 String 값으로 반환하면 이번문제를 해결할 수 있었다.

728x90