2016년

문제정의


2016년의 월과 일을 입력하면 요일을 출력해주는 프로그램을 짜는 문제이다.

문제풀이


물론 제일 쉬운 방법은 스위치문이나 if-else문으로 모든 경우의 수를 짜는 것이겠지만(실제로 문제를 풀고 다른 사람 풀이 중에 그렇게 푼 사람이 있었다! 정말 존경한다.), 필자는 1월 1일부터 며칠이나 떨어져있는지 계산한 후 그 날을 요일로 바꾸는 연산을 하였다.

전체 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Year2016 {

public static void main(String[] args)
{
int a = 1;
int b = 3;
String answer = "";
int[] months = {0,31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30};
String[] days = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
int day = 4;
int month = 1;
while(month != a)
{
day += months[month];
month++;
}
day += b-1;
day %= 7;
answer = days[day];
System.out.println(answer);
}

}
코드가 짧으므로 오늘은 부분적으로 코드를 끊어서 보지 않겠다. 일단 월마다 더하는 달을 배열로 저장해둔다. 예를 들어 1월 1일에서 2월 1일로 넘어가기 위해선 31일이 필요하다. 0월이란 수는 없으므로 months의 첫번째 수는 0으로 채운다. 그리고 days에는 요일을 저장해둔다. 문제에서 2016년 1월 1일은 금요일이라 했으므로 금요일의 배열 인덱스인 4를 기본값으로한다. 이제 a와 b에 따라 요일을 출력해보자. 초기 달은 1월인데 만약 원하는 달이 1월이 아닌 경우 months의 일수를 더해간다. 그리고 b일 -1을 더해준다(1일에서 넘어가기 시작하는거기 때문이다.). 총 일수를 구했으니 이를 7로 나머지 연산을 하면 요일을 구할 수 있다.

총 시간복잡도는 a의 크기에 따라 달라지므로 a의 크기를 n이라하면 \(O(n)\)이다.

테스트



다른 사람의 풀이를 보니 하나하나 스위치문과 if문을 통해 구현한 사람이 있었다. 정말 대단한 사람이라고 생각한다. 문제풀이를 처음 시작할 때 효율적인 방법을 몰라도 일단 풀고자 하는 마음이 중요하다.