자바 초급문제로 맨땅에 해딩하기

자바 초급문제 9-1. 2016년 다시 살펴보기

Jungsoomin :) 2020. 3. 31. 23:42

프로그래머스(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