프로그래머스 - 2016년

Lee·2023년 4월 7일
0

알고리즘

목록 보기
11/34
post-thumbnail

문제 출처

문제 출처 : 2016년

문제 이해하기

  • 지문 자체가 어렵지 않기 때문에 쉽게 이해할 수 있을 것 같다.
  • 2016년 a월 b일이 주어졌을 때, 어떤 요일인지를 구하는 문제이다.
  • 문제에서도 알 수 있는 것처럼 유효날 날짜로만 입력이 들어온다.

주요 조건 이해하기 ⭐️

주어진 입출력과 문제에 나와있는 규칙을 바탕으로 관찰을 해보면 특정 요일을 구하기 위해선 먼저 총 일수을 구해한다. 예를 들어 a = 2, b= 12일 이라면 1월에 전체 일수와 b를 더하면 총 43일이라는 숫자가 나오고 이 수를 다시 7로 나눴을 때 나머지가 1이 나오게 되는데 이 나머지로 나온 수가 해당 요일을 가리키게 된다.

여기까지만 생각했다고 해서 바로 코딩하게 된다면 문제를 틀릴 가능성이 높다.
한가지 중요한 사실은 나머지로 나온 숫자와 요일을 어떤 방식으로 매칭을 할 것이냐?라는 문제가 아직 남아있다.

문제에 나와있듯이 1월 1일은 금요일이다. 이를 순서대로 1월 6일 목요일까지 해당되는 일을 7로 나눈 나머지를 구해보면 아래와 같은 표로 나타낼 수 있다.

0 - 금요일
1 - 토요일
2 - 일요일
3 - 월요일
4 - 화요일
5 - 수요일
6 - 목요일

이를 바탕으로 생각나는대로 코드를 작성해봤다.

1차 코드

class Solution {
    public String solution(int a, int b) {
		String answer = "";

		int totalDay = 0;
        
        // 이 부분에서 원소의 갯수가 13개였음,,
		int[] days = {31, 29, 31, 30, 31, 30, 31, 31, 31, 30, 31, 30, 31};

		for (int i = 0; i < a - 1; i++) {
			totalDay += days[i];
		}

		totalDay += (b - 1);

		switch (totalDay % 7) {
			case 0:
				answer = "FRI";
				break;
			case 1:
				answer = "SAT";
				break;
			case 2:
				answer = "SUN";
				break;
			case 3:
				answer = "MON";
				break;
			case 4:
				answer = "TUE";
				break;
			case 5:
				answer = "WED";
				break;
			case 6:
				answer = "THU";
				break;

		}

		return answer;
	}
}

위와 같은 코드를 작성한 후 제출을 시도하면 테스트 케이스 3번과 14번을 실패하게 된다.

조심스럽게 마지막 요일을 정의해놓은 배열의 갯수가 12개인 상태여야하지만, 13개인 상태였다..한마디로 오타였다,,🥹

int[] days = {31, 29, 31, 30, 31, 30, 31, 31, 31, 30, 31, 30, 31};

오타도 발견한 겸, 소스를 조금이나마 개선해보고 싶어 리펙토링을 진행했고 최종 결과물은 아래와 같다.

최종 소스 개선된 코드

class Solution {
    public String solution(int a, int b) {
		
		int totalDay = 0;

		String[] weekday = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
		int[] finalDays = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

		// for문을 돌려 a-1까지 date 배열에 있는 값을 totalDay 변수에 더해준다.(7월이라면 6월까지는 다 더하는 것)
		for (int i = 0; i < a - 1; i++) {
			totalDay += finalDays[i];
		}

		// b-1를 해주는 이유는 해당 요일이 지난 일이 아니기 때문이다.
		// b-1을 해주지 않는다면 day[select]는 day [1]이 되어 버리고 그러면 1월 1일은 금요일인데 SAT가 나오게 된다.
		totalDay += (b - 1);

		return weekday[totalDay % 7];
	}
}

0개의 댓글