프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/12901)
자바 초급 문제의 2016년 을 다시 코딩했다.
문제 설명
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일같은 날짜는 주어지지 않습니다)
일단, 요행은 버렸다. 윤달이 366일 인 점을 감안하여 그에 따른 날짜를 배열해서 정말 a월 b일의 요일을 구하려고 접근했다.
1.String 타입 배열 year를 선언하여 각 인덱스에 맞는 요일을 넣어 줄 준비를 한다.
2.String배열 days를 선언하고 요일들을 기입하여 초기화한다.
3.int배열 month에 각 월의 마지막 날을 기입하여 초기화한다.
4.오늘의 날짜의 누적일을 합산해줄 int 변수 sum을 선언하고 초기화한다.
5.for문을 0~355만큼 돌린다(366) 그때마다 year의 인덱스에 days의(i+5)즉 금요일시작점%7을 하여주면 그 나머지의 값에 따라서 days의 인덱스 안에서 숫자가 바뀐다. 그렇게 366일의 날짜를 맞춘다.
6.for문을 다시돌린다. b일은 전달까지의 날짜 +b 이다. 즉 for문은 해당 달의 날짜는 포함해서는 안된다.
그러므로 a-1까지 돌려서 0~a-1(전 달의 모든 날짜)까지 잡아준다. 그 날들을 sum에 +=해 준다.
7.이번 달의 날짜인 b-1(1월1일 제외)도 sum에 합산하여 대입한다.
8.여기까지 왔다면 year의 인덱스에는 각 날짜의 요일이 정해져있을 것이고, sum에는 1월1일을 제외한 b일까지의 누적 일 수가 들어있을것이다. 그러므로 sum이 곧 year의 인덱스 값이 된다.
9.answer에 year[sum] 을 대입.
10. a월 b일의 요일이 무사히 출력된다.
여기까지다. 내가 만든 코드를 보아도, 디버깅을 출력위주로 하느라 잘 이해가 되기 힘들었는데, 어떻게 파고들어서 이해했다.
조만간에 코드를 복기할 시간이 주어졌을 때에, 아무것도 보지않고 다시 쳐볼 생각이다.
내 것 같지가 않다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package programmers_2016년;
public class Exam03 {
public String solution(int a, int b) {
String answer ="";
String[] year = new String[366];
String[] days = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
int[] month = {31,29,31,30,31,30,31,31,30,31,30,31};
int sum = 0;
for(int i=0; i<year.length; i++) {
year[i] = days[(i+5)%7];
}
for(int i =0; i<a-1; i++ ) {
sum += month[i];
}
sum += b-1;
answer = year[sum];
return answer;
}
}
|
cs |
'자바 초급문제로 맨땅에 해딩하기' 카테고리의 다른 글
자바 초급문제 10. 크레인인형뽑기게임 (0) | 2020.04.03 |
---|---|
자바 초급문제 10. 크레인인형뽑기게임 도전 중. (0) | 2020.04.02 |
자바 초급문제 9. 2016년 (0) | 2020.03.31 |
자바 초급문제 8. 핸드폰 번호 가리기 (0) | 2020.03.29 |
자바 초급문제 7. K번째수 (0) | 2020.03.29 |