Algorithm/Java

[프로그래머스/JAVA] 2016년

dbfl9911 2025. 1. 27. 10:23
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/12901

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

📌 문제 요약 

 

2016년 1월 1일은 금요일입니다.
주어진 날짜(2016년 a월 b일)의 요일을 계산하는 함수 solution을 작성합니다.

  • 요일은 일요일부터 토요일까지 SUN, MON, TUE, WED, THU, FRI, SAT 순서로 반환됩니다.
  • 예를 들어, a = 5, b = 24인 경우, 결과는 "TUE"입니다.

 


 

[ 정답 코드 & 풀이 ]

📌 풀이

 

1. 요일 배열 정의

  • 요일을 문자열 배열 dw에 저장합니다.
    2016년 1월 1일은 금요일(FRI)이므로 "FRI"부터 시작합니다.

 

2. 월별 일수 배열 정의

  • days 배열에 2016년 각 월의 일수를 저장합니다.
  • 윤년이므로 2월은 29일까지 존재합니다.

 

3. 총 일수 계산

  • 입력된 날짜가 기준 날짜(2016년 1월 1일)에서 몇 번째 날인지 계산합니다.
    • 입력된 월 a까지의 총 일수를 계산하기 위해:
      1. 1월부터 a-1월까지의 일수를 sumday에 누적합니다.
      2. 입력된 날짜 b에서 1을 뺀 값을 추가하여 해당 월의 전날까지의 총 일수를 포함합니다.

 

4. 요일 계산

  • 총 일수를 7로 나눈 나머지를 사용하여 요일 배열의 인덱스를 계산합니다.
  • 나머지는 요일 배열(dw)에서 대응되는 요일을 반환합니다.

 

5. 결과 반환

  • 계산된 요일 문자열을 반환합니다.

 

 

** 입력된 날짜 b에서 1을 뺀 값을 추가하는 이유?

 

예를 들어, 1월 1일1월 3일의 차이를 계산한다고 가정해봤을때,

  • 1월 1일: 기준점으로 총 누적 일수는 0.
  • 1월 3일까지의 날짜를 계산하려면,
    1월 1일부터 2일 후라는 계산이 되어야 합니다.
    • b = 3을 그대로 사용하면 총 3일로 계산되는데,
      이는 "1월 1일"도 포함되므로 실제보다 하루가 더해진 값입니다.
    • b - 1 = 3 - 1 = 2를 사용하면 "1월 1일" 전날을 기준으로 올바르게 계산됩니다.

 




📌 정답 코드

class Solution {
    public String solution(int a, int b) {
        String answer = "";
        // 윤년 일수 - 366일 (2월 끝일이 29일)
        // 1월 ~ 12월 끝일
        // 31,29,31,30,31,30,31,31,30,31,30,31
        
        // 1. 해당 날짜까지 총 일수 계산
        // 2016년 1월 1일은 금요일
        String[] dw = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"}; 
        int[] days = {31,29,31,30,31,30,31,31,30,31,30,31};
        
        // 해당 월 전까지의 일수 더하기
        int sumday = 0;
        for(int i = 0; i < a-1; i++) { 
            sumday += days[i];
        }
        
        // 해당 월의 일수 더하기
        // b일 전날까지의 날짜 포함 (5월 23일까지)
        sumday += (b - 1);
        
        // 2. 해당 날짜 요일 계산
        answer = dw[sumday % 7];
        
        return answer;
    }
}
반응형