본문 바로가기

알고리즘

[알고리즘/Programmers] LV1. 2016년

728x90
반응형

Programmers LV1. 2017년

 

문제 설명

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

 

입출력 예

a b result
5 24 "TUE"

 

사용 언어

Java

 

해결 방법

1. Calendar API 이용

2. 계산법 이용 (2016년 1월 1일 금요일 기준) --> 내가 시도하던 방법

 

Calendar를 아래 코드 뿐만 아니라 더 다양한 메서드를 활용해서 적용할 수도 있긴 하다.

계산법은 아래 코드가 제일 쉽고 깔끔한 것 같다.

 

알게된 것

  • Calendar API 메서드, 상수
    • cal.getInstance() : 캘린더 셋팅 시 초기 인스턴스 생성해주어야 함.
    • cal.set() / cal.get()
    • Calendar.YEAR
      Calendar.MONTH : 0=1월, 1=2월, 2=3월 ...
      Calendar.DATE
      Calendar.DAY_OF_WEEK : 현재 지정된 날짜의 요일. 1=일요일, 2=월요일 ...
      ❗ MONTH, DAY_OF_WEEK 는 반환 넘버와 실제 월/요일 매칭 주의하기

코드

public class test_12901 {
	public static void main(String[] args) {
	//	System.out.println(solution(5, 24)); // TUE
		System.out.println(solution2(5, 24));
	}

	// 1. Calendar API 이용
	public static String solution(int a, int b) { // 2016년 a월, b일 -> 요일 리턴
		String answer = "";
		String[] DAY = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};

		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, 2016);
		// 0:1월, 1:2월 ...
		cal.set(Calendar.MONTH, a-1);
		cal.set(Calendar.DATE, b);

		// 1:일요일, 2:월요일 ...
		int idx = cal.get(Calendar.DAY_OF_WEEK);

		answer = DAY[idx-1];
		return answer;
	}

	// 2. 계산법 이용
	public static String solution2(int a, int b) {
		// 2016. 1. 1 -> FRI
		String answer = "";
		int[] MONTH_PLUS = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 2016년 2월은 윤달이라 29일
		String[] DAY = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
		int sum = 0;

		for(int i = 0; i<a-1; i++) {
			sum += MONTH_PLUS[i];
		}
		sum += (b-1);

		answer = DAY[sum%7];

		return answer;
	}
}

 


 

Calendar API 처럼 날짜 다루는 건 필요할 때 찾고 복붙하게 되어서 바로 이거 써야지 생각하기가 쉽지 않았다. 꼭 2번 방법이 아니어도 java를 활용한다면 저런 라이브러리를 쓸 수도 있겠다는 생각이 들었다. 알고리즘 문제로서 요구하는건 계산법이겠지만!ㅎ 나는 2번 방법으로 접근했고 비슷하게 생각, 구현까지는 했는데 재대로 값이 안나와서 계속 해맸다. 2월을 28로 해놓고 안된다고 하고있으니 참 ㅎㅠ 코드는 비슷했고 가장 깔끔한 코드 찾아서 재적용해보았다. 캘린더 API 도 자주 다뤄봐야할 것 같다.

728x90
반응형