Algorithms/- 프로그래머스

프로그래머스 - 2016년 [자바]

자굿 2022. 1. 31. 02:09
 

코딩테스트 연습 - 2016년

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까

programmers.co.kr

정답

import java.util.*;

class Solution {
    public String solution(int a, int b) {

        /*
            a월 b일 무슨 요일
            answer = 요일
            윤년 2월 29일까지 있음

            31 : 1,3,5,7,8,10,12
            이외 : 2,4,6,9,11
            key : value
        */

        String[] days = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};

        //요일은 쭉 이어진다.
        //7로 나눈 나머지라고 할 수 있다.
        // 예를 들어 2016년을 1월 1일 부터 진행할때 금요일이다.
        //2016.01.01이 금요일이다. 여기서부터 쭉 더해지면 된다.
        //+1 -> 금 +2 -> 토 +3 -> 일 +4: 월 5화6수7목+8금

        Map<Integer, Integer> cal = new HashMap<>();

        cal.put(1, 31);
        cal.put(2, 29);
        cal.put(3, 31);
        cal.put(4, 30);
        cal.put(5, 31);
        cal.put(6, 30);
        cal.put(7, 31);
        cal.put(8, 31);
        cal.put(9, 30);
        cal.put(10, 31);
        cal.put(11, 30);
        cal.put(12, 31);

        int count = 0;

        for(int i=1; i<=a-1; i++){
            count += cal.get(i);
            System.out.println(count);
        }
        count += b;
            System.out.println(count);
        //index 조정 :  index == 0일때 sun이여야 하나 1월 1일이 금요일(+1일) 이기 때문에
        //index == 0일때 목요일이 나옴
        //그러므로 7로 나눈 나머지에 index +4 만큼 해준다.
        int index = ((count % 7) + 4) %7;

        return days[index];
    }
}

분석

  • 2016년의 1월 1일을 0으로 가정하고 해당 월,일을 더해주었다.
  • 요일 배열에서는 인덱스 0이 sun이므로 1월1일이 금요일(+1일)인 index를 맞추기 위해서 +4를 해주었다.
    • 1월 1일이 +1일이 되었고 금요일이기 때문에 index 0은 목요일이므로 (일 - 0, 월 - 1, 화 - 2, 수 - 3, 목 - 4) +4를 해주면 된다.
  • +4를 해주었을때 7이상이 될 수도 있기 때문에 다시 7로 나눈 나머지의 인덱스를 구하였다.

참고할 만한 정답

  • 자바 내장함수를 사용
  • 알고리즘 테스트에서는 내 정답과 비슷하게 풀기를 원하겠지만 실무에서는 아래와 같은 방법이 맞을듯 싶다.
//문제가 변형되어 현재 문제에 맞게 참고 정답 변경
import java.util.*;

class Solution {
    public String solution(int a, int b) {

        Calendar cal = new Calendar.Builder().setCalendarType("gregory")
                        .setDate(2016, a - 1, b).build();

        return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, new Locale("US")).toUpperCase();
    }
}
반응형