출처: https://www.acmicpc.net/problem/1924
문제
오늘은 2007년 1월 1일 월요일이다. 그렇다면 2007년 x월 y일은 무슨 요일일까? 이를 알아내는 프로그램을 작성하시오.
입력
첫째 줄에 빈 칸을 사이에 두고 x(1 ≤ x ≤ 12)와 y(1 ≤ y ≤ 31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.
출력
첫째 줄에 x월 y일이 무슨 요일인지에 따라 SUN, MON, TUE, WED, THU, FRI, SAT중 하나를 출력한다.
알고리즘
이번 문제는 임의의 날짜가 주어지면 그 날의 요일을 출력하는 문제입니다.
요일은 7일 반복이므로 7로 나눈 나머지를 이용하여 요일을 특정합니다.
입력에 월을 month로, 일을 day로 받았다고 하면,
1월부터 시작이므로 총 날짜 수로 정한 변수(total)에
1월은 day를 더한 값을 나눈 나머지,
2월은 1월 일 수에 day를 더한 값을 나눈 나머지,
3월은 1, 2월 일 수에 day를 더한 값을 나눈 나머지
...
이러한 알고리즘을 이용하여 1월 1일이 MON이므로 나머지가 1이면 MON으로 정하여 코드를 작성합니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int month = Integer.parseInt(st.nextToken());
int day = Integer.parseInt(st.nextToken());
int total = 0;
int[] monMax = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String[] w = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
for(int i = 0; i < month-1; i++) {
total += monMax[i];
}
total += day;
System.out.println(w[total%7]);
}
}
처음에 문제를 풀 때는 일일히 대입하는 식으로 진행했습니다.
이번 코드와 비교하여 메모리는 조금 더 사용했지만 시간은 동일하게 나왔습니다.
하지만, 이 방식은 하나씩 모두 집어넣는 방법이고 이번에는 2007년만 계산했기에 빠르게 끝났던 것으로
년 수가 많아질수록 속도는 느려질 것이라 생각하여 다시한번 문제를 풀어봤습니다.
이 글의 알고리즘이나 코드에서 지적할만한 부분은 댓글에 남겨주시면 저에게 많은 힘이 됩니다! |
'Java > 백준문제풀이' 카테고리의 다른 글
[백준] 2609번: 최대공약수와 최소공배수 [JAVA] (0) | 2022.05.20 |
---|---|
[백준] 1193번: 분수찾기 [JAVA] (0) | 2022.03.19 |
[백준] 11047번: 동전 0 [JAVA] (0) | 2022.03.06 |
[백준] 10250번: ACM 호텔 [JAVA] (0) | 2022.03.04 |
[백준] 9095번: 1, 2, 3 더하기 [JAVA] (0) | 2022.03.03 |
댓글