2016년_Java

컴투루·2022년 6월 29일
0

프로그래머스 Lv.1

목록 보기
23/38

연습문제

🔥 2016년 🔥


👀 문제

2016년 1월 1일은 금요일이다. 두 수 a,b를 입력받아 2016년 a월 b일이 무슨요일인지 리턴하는 함수 solution을 완성해보자.


✔️ 조건

  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

👩‍💻 입력 & 🧙 출력

abreturn
54"TUE"

🙋‍♀️ 첫번째 풀이

문제를 보고 어떻게 풀어야하는거지? 생각한 문제는 처음이었다.
아무생각도 들지 않았다.

그래도 어떻게든 풀어본다고 해봤는데

import java.util.*;
class Solution {
    public String solution(int a, int b) {
        
        String[] day = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
        ArrayList<String> days = new ArrayList<>(Arrays.asList(day));
        String[] date = new String[12]; //각월의 시작 요일을 대입
    
         String answer = "";
       
        int n = 5;
        
        //시작요일
        for(int i=1;i<date.length;i++){
            date[0] = "FRI";
                
            if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10){
                n = n+3;
                if(n >= day.length){
                    n = n - day.length;
                }

                date[i] = day[n];
            }else if(i == 4 || i == 6 || i == 9 || i == 11){
                n = n+2;
                
                if(n>=day.length){
                    n = n - day.length;
                }

                date[i] = day[n];
            }else if(i==2){
                n = 2;

                date[i] = day[n];
            }       
        }
        
        
        String start = date[a-1]; //각 월의 시작 요일
       
        int index = days.indexOf(start); //시작하는 요일의 인덱스값 
        
        
            int f = index+(b-1)%7;
            if(f>day.length){
                f = f-day.length;
                answer = day[f];
            }else if(f == day.length){
                   answer = day[index-1];  
                if(a==1){
                    if(index+2 >= day.length){
                        int i = index+2;
                        answer = day[i - day.length];
                    }else{
                        answer = day[index+2];    
                    }
                    
                }
             
            }else{
                answer = day[f];
            }


        return answer;
    }
}

3번테스트에서 오류가 났고 결국 해결하지 못했다.

🙋‍♀️ 두번째 풀이

class Solution {
    public String solution(int a, int b) {
        String answer = "";    
        
        String[] day = {"FRI","SAT","SUN","MON","TUE","WED","THU"};
        int[] last = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        
        int date = 0;
        for(int i=0;i<a-1;i++){
            date += last[i];
        }
        
        date += b-1;
        
        answer = day[date%7];

        return answer;
    }
}
  1. 1월1일이 금요일이기 때문에 금요일부터 시작하는 배열 day선언
  2. 각 월의 마지막 일을 대입하는 last 선언
  3. 만약 입력된 월이 5일이라면 1,2,3,4월까지의 모든 일수를 더하고 입력된 b의 -1을 한 일수를 더해준다.
    따라서 1월 1일부터 a월 b일까지 모든 날짜를 더한 값이 date가 된다.
  4. 마지막으로 date를 7로 나눈 나머지 값을 day에 대입해서 return해준다.

💬 다른 풀이

import java.time.*;
class Solution {
  public String solution(int a, int b) {
      return LocalDate.of(2016, a, b).getDayOfWeek().toString().substring(0,3);
  }
}

java.time api를 이용한 풀이

  1. LocalDate.of를 통해 특정 날짜를 가져오고
  2. getDayOfWeek를 통해 요일을 가져오고
  3. toString으로 string으로 형변환
  4. subString으로 앞에 세글자만 출력

👏 마무리

처음에 풀었던 방법으로는 해결할 수 없는걸까...

profile
맘 먹으면 못할 게 없지

0개의 댓글