본문 바로가기

ALGORITHM

[프로그래머스 Java] 2016년

 

코딩테스트 연습 - 2016년

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

programmers.co.kr

⏱소요 시간 - 35분

 

🔑해결 방법

 

사실 이 문제는 요일을 구하는 복잡한 알고리즘이 이미 존재할 것 같아서 구글링해서 코드를 짰다.ㅎㅎ

찾아보니 별게 없어서 스스로 생각해볼껄... 후회가 되는 문제. 다음에 꼭 다시 풀어보자!

 

규칙을 한 번에 알 수 없는 문제의 경우, 쉽게 알 수 있는 예로부터 수식을 얻어내면 간편하다.

1월 8일, 9일 정도면 금요일, 토요일이라는걸 바로 알 수 있으니 해당 예시로 아래 수식을 계산해보자.

 

1. for문

같은 1월이므로 for문을 통해 얻는 sum 값은 초기화 상태 그대로의 0이다.

 

2. sum = (sum + b - 1);

1월 8일 : 0 + 8 - 1 = 7 --> sum = 7 값이 나오는 것을 확인할 수 있다.

1월 9일 : 0 + 9 - 1 = 8 -- > sum = 8 값이 나오는 것을 확인할 수 있다.

 

그렇다면 sum 값을 통해 week[] 배열의 값을 얻고 싶다면 어떻게 활용할까?

/를 해볼지 %를 해볼지 이것저것 생각을 해보자.

 

3. week[sum % 7]

1월 8일 : 7 % 7 = 0 --> week[0] -> "FRI"

1월 9일 : 8 % 7 = 1 --> week[1] -> "SAT"

 

 

 

🔎소스 코드

 

package step1;

// 2016년
public class Ex07 {

	public static void main(String[] args) {
		
		System.out.println(solution(5, 23));

	}
	
	public static String solution(int a, int b) {
		
		String answer = "";
		
		int[] month = { 31, 29, 31, 30, 31, 30, 
				31, 31, 30, 31, 30, 31 }; // 1~12월 날짜 수 (윤년)
		
		String[] week = { "FRI", "SAT", "SUN", "MON", 
				  "TUE", "WED", "THU" }; // 1월 1일이 금요일이므로 금요일부터
		
		int sum = 0; // 날짜 합계가 담길 변수
		
		// 입력으로 들어온 달의 전까지 모든 달의 수를 더함
		for(int i = 0; i < a - 1; i++) {
			sum += month[i];
		}
		
		/*
		   +b : 입력받은 날짜 더해주기
		   -1 : 1월 1일 빼주기
		   %7 : week.length만큼 나눠주기
		*/
		
		sum = (sum + b - 1);
		
		answer = week[sum % 7];
		
		return answer;
		
	}

}