본문 바로가기
코딩테스트 연습

프로그래머스 2016년 Level 1

by 동배_ 2021. 8. 24.

문제 설명

https://programmers.co.kr/learn/courses/30/lessons/12901?language=java 

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일같은 날짜는 주어지지 않습니다)

입출력 예

a                                 b                                            result

5 24 "TUE"

 


문제 해석 및 풀이 방법

1. 31일인 달과 30일인 달, 윤년인 29일 인 달을 구분한 다.

2. 1월부터 입력받은 달까지 1씩 올려 반복하며 일수를 추가한다.

3. 추가된 일수에 입력받은 일을 빼준 후 나머지를 통한 요일의 인덱스를 계산한다.

 

내가 작성한 소스코드(Java)

class Solution {
    public String solution(int a, int b) {
        String[] day = {"FRI","SAT","SUN","MON","TUE","WED","THU"};
        int sum = 0;
        for(int i=1;i<a;i++){
            if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) sum += 31;
            if(i == 2) sum += 29;
            if(i == 4 || i == 6 || i == 9 || i == 11) sum += 30;
        }
        sum += b-1;
        return day[sum%7];
    }
}

day에 금 토 일 월 화 수 목의 배열을 추가해준다. 이 때 금요일부터 시작하는 이유는 문제에 1월1일이 금요일이라고 나와 있기 때문이다.

 

그리고 1부터 a의 전달까지 반복문을 1씩 증가하며 반복한다. 

그리고 1 3 5 7 8 10 12일에는 31일 2월이면 29일 나머지는 30일을 sum변수에 추가해준다.

그 후 반복문이 끝나면 b를 추가해준다(일 추가)

그리고 1을 빼준다. 빼주지 않으면 1월1일이 지난 상태로 치기 때문이다.

 

그리고 sum을 일주일의 단위인 7을 나눈 나머지를 day의 인덱스로 지정하면 그 월, 일의 요일이 나오게 된다.

결론 및 고찰

이 문제는 예전에 학교 수업시간에 한번 풀어봤다 고생한 기억이 있어서 쉽게 풀 수 있었다. 왜 고생을 했냐면 당시에 윤월, 윤년, 30일, 31일 이런 것들을 알지 못했고 수시평가 느낌으로 했었는데 그래서 30일, 31일 같은 경우는 윈도우 달력을 보고 얼추 알았지만 윤년 같은 경우를 해결하지 못해서 실패했던 기억이 있다. 그래서 끝나자말자 바로 찾아봤었는데 그게 좀 한이 돼서였는지 문제를 보자말자 쉽게 풀 수 있엇다 

 

소요 시간 10

댓글