본문 바로가기

알고리즘/Programmers

[Programmers] Level1. 2016년 (Java)

Level1. 2016년

문제설명 )

 

풀이Code )

더보기
class Solution {
    public String solution(int a, int b) {
        int[] month = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int day = 0;
        String[] week ={"FRI","SAT","SUN","MON","TUE","WED","THU"};
        String answer = "";

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

        answer = week[(day + b - 1) % 7];

        return answer;
    }
}

풀이법 )

  1. 달력의 일자에 맞춰 숫자형 배열을 선언해준다.
  2. 해당월에 맞춰 일수를 더해줄 day 변수를 선언한다.
  3. week라는 문자열 배열을 선언하여 answer 에 담을수있게 선언한다.
  4. for문을 사용하여 주어진 월에 맞춰 일수를 더해준다.
  5. 7을 나누어 나온 나머지값의 week인덱스가 해당 일의 요일이 된다.

2021.11.14 풀이

더보기
class Solution {
    public String solution(int a, int b) {
        String answer = "";
        String[] week = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
        int[] startWeek = {5,1,2,5,0,3,5,1,4,6,2,4};
        int addDays = b>1 ? ((b-1)%7) : 0; // 일주일 단위로 나눈 나머지값
        int weekIndex = 0; // 최종적으로 요일의 인덱스
        
        // addDays를 해줬을때 한 주를 넘어가게되면 일요일부터 다시계산해준다.
        // 수요일인데 addDays가 4인경우 넘어가니까 7일을 빼주고 0에서부터 addDays해준다.
        if(startWeek[a-1] + addDays > 6) {
            weekIndex = (startWeek[a-1]-7) + addDays; 
        } else {
            weekIndex = startWeek[a-1] + addDays; 
        }
        
        // 최종적으로 나온 요일의 인덱스를 리턴
        answer = week[weekIndex];
        
        return answer;
    }
}

기존에 풀었던 방식에서 반복문을 없앴다.

지금상태에선 시간복잡도의 차이가 얼마나지않지만, 데이터가 많거나 복잡한 경우에 속도의 차이가 많이 날것같다.

가독성은 기존에 풀었던 방식이 훨씬 좋은것같다..