프로그래머스 - 2016년

Jongleee·2022년 7월 16일
1

알고리즘

목록 보기
1/39

나의 풀이

class Solution {
    public String solution(int a, int b) {
        String answer = "";
        // 1월 1일이 금요일이라고 주어졌으므로 금요일을 시작으로 요일의 값을 정하고 각 월의 총 일자를 정해줌
        String[] week = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
        int[] date = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        // 지나온 달의 일수를 모두 더해줌
        int day = 0;
        for (int i = 0; i < a - 1; i++) {
            day += date[i];
        }
        // 해당 일자까지의 일 수를 더해줌
        day += b - 1;
        // 해당 값을 7로 나눈 나머지가 금요일부터 지나온 요일
        answer = week[day % 7];
        return answer;
    }
}

조원의 풀이

모든 년도에 계산

import java.util.Scanner;

public class Algorithm_01 {
    public static void main(String[] args) {
        int year = 2016; //년도 변수
        int a=0; //월 변수
        int b=0; //일 변수
        Scanner input = new Scanner(System.in); //스캔 변수 선언

        System.out.println("월(1~12)을 입력하세요");
        a = input.nextInt();  //월 값 받기

        System.out.println("일(1~31)을 입력하세요");
        b = input.nextInt(); //일 값 받기

        System.out.print(a + "월" + b + "일");

        int total = (year - 1) * 365
                +(year - 1)/4
                -(year - 1)/100
                +(year - 1)/400;  // 전년도의 총 일수 구하기

        int a_b[] = {31,28,31,30,31,30,31,31,30,31,30,31}; 

        if((year%4==0 && year%100 !=0) || (year%100 ==0) )
        {
            a_b[1] = 29; //윤년에는 29일로 변경
        }
        else
        {
            a_b[1] =28; //평년에는 28일
        }


        for(int i = 0 ; i < a-1 ; i++)
        {
            total += a_b[i]; // 현재 년도의 저번 달까지의 일수 더하기
        }

        total += b; //이번 달에 일수 더하기

        int day= total%7; //요일값 구하기
        String[] week = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
        System.out.println(week[day]);

    }
}

3항연산자 사용

public class WhatDay {
    public String solution(int a, int b) {
        String answer = "";
        int year = 2016;    // 년도
        boolean leapYear = year % 100 != 0 && year % 4 == 0 || year % 400 == 0; // 윤년 검증 표현식
        String[] allDay = new String[leapYear ? 366 : 365]; // 모든 날을 담을 배열 생성
        String[] days = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};  // 요일을 담은 배열
        int[] month = {31, (leapYear ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};   // 각 월별 일수를 담은 배열
        int idx = 0;    // 날짜를 탐색하기 위한 index

        // allDay[] 배열에 요일을 순차적으로 담아준다.
        // 2016년 1월 1일은 "FRI"부터 시작이기 때문에 금요일부터 시작할 수 있게 계산해준다.
        for (int i = 0; i < allDay.length; i++) {
            allDay[i] = days[(i + 5) % 7];
        }

        // 우선 내가 선택한 월의 이전 월까지의 일수만 idx에 모아준다. (그 시점 부터 일자를 탐색할 예정)
        for (int i = 0; i < a - 1; i++) {
            idx += month[i];
        }

        // idx에 내가 선택한 일수 - 1 만큼 더해준다. (1월 0일이 아닌 1월 1일 부터 시작해서 하루가 밀리기 때문)
        idx += b - 1;
        answer = allDay[idx];   // 모든 날이 담긴 배열에 idx로 내가 찾는 날짜로 이동하여 요일을 얻어낸다.

        return answer;
    }
}

0개의 댓글