will come true

[프로그래머스 / Level1] 2016년 (Java) 본문

Algorithm

[프로그래머스 / Level1] 2016년 (Java)

haehyun 2021. 10. 31. 17:26
728x90

문제

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

 

코딩테스트 연습 - 2016년

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

programmers.co.kr

 

핵심 키워드

  • 날짜 관련 클래스
  • Date 클래스
  • Calendar 클래스
  • java.time 패키지
  • LocalDate 클래스

 

기존 코드 (성공) - LocalDate 코드

import java.time.LocalDate;

class Solution {
    public String solution(int a, int b) {
        String answer = "";
        LocalDate date = LocalDate.of(2016, a, b);
        answer = date.getDayOfWeek().toString().substring(0, 3);
        
        return answer;
    }
}

- LocalDate 내장함수를 사용하여 2016년 a월 b일의 요일을 구했다.
- getDayOfWeek() 인스턴스 메서드는 반환값이 DayOfWeek이기 때문에 .toString()후 문자열을 잘라줘야 한다.

 

메서드 설명
static LocalDate of(int year, int month, int day) 지정한 연, 월, 일로 LocalDate 객체 생성
DayOfWeek getDayOfWeek() 요일(TUESDAY) 반환. getDayOfWeek().getValue() = 2 
int get(TemporalField field) 지정한 필드에 해당하는 상수 값 반환

*TemporalField는 년, 월, 일 등 날짜와 시간의 필드를 정의해 놓은 것으로, 열거형 ChronoField가 이 인터페이스를 구현한다. 열거형 ChronoField는 관련된 날짜 상수들(DAY_OF_WEEK, DAY_OF_MONTH 등..)을 하나로 묶은 것이다.

아래는 Java에서 제공하는 다른 날짜 클래스 및 메서드를 사용하여 구현한 코드이다.

 

Calendar 코드

import java.util.Calendar;

class Solution {
    public String solution(int a, int b) {
        String answer = "";
        final String[] DAY_OF_WEEK = { "", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"} ;	//요일 배열
        
        Calendar cal = Calendar.getInstance();
        cal.set(2016, a-1, b);		//Calendar는 월이 0부터 시작(0:1월)
        answer = DAY_OF_WEEK[cal.get(Calendar.DAY_OF_WEEK)];	//Calendar는 요일이 1부터 시작(1:일요일), 숫자로 반환
        
        return answer;
    }
}

- Calendar는 요일을 무조건 숫자로 반환해주기 때문에 해당 숫자를 index로 접근해서 요일 문자열을 얻어올 배열을 선언해둔다. Calendar는 요일이 1부터 시작하기 때문에(1~7, 1:일요일) 0의 자리는 비워둔다.
- Calendar에서 월은 0부터 시작하기 때문에(0~11, 0:1월) a에서 1뺀 값을 월로 지정해줘야 한다. (ex: a가 6월일 경우 a값을 그대로 넘기면 Calendar객체는 7월로 설정된다.

메서드 설명
static Calendar getInstance() Calendar 객체를 생성해서 반환
void set(int year, int month, int day) Calendar 객체를 원하는 날짜로 설정 (default : 현재 날짜)
int get(int field) Calender 객체에서 field에 해당하는 값을 반환
Calendar.DAY_OF_WEEK Calendar 클래스에 선언된 final 상수 (DAY_OF_WEEK = 7)

 

※ Calendar와 LocalDate에서 월(MONTH), 요일(DAY_OF_WEEK)의 차이

  • Calendar : 월(0~11, 0:1월), 요일(1~7, 1:일요일)
  • LocalDate : 월(1~12, 1:1월), 요일(1~7, 1:월요일)

 

날짜 관련 클래스가 여러개인 이유

초기에는 날짜와 시간을 다룰 목적으로 Date 클래스만을 제공했으며(JDK1.0), 이후 Date의 부족한 기능을 보완해서 Calendar 클래스를 추가 제공하였다(JDK1.1). 날짜 관련으로는 이 두 클래스만을 오랜 시간 사용하다가 한참이 지나서 Date와 Calendar의 단점을 보완한 java.time패키지를 내놓은 것(JDK1.8). 제공 버전의 차이가 큰 만큼 Date, Calendar는 너무 오랜 시간 사용되었기 때문에 아직까지 없애지 못하고 남아있는 것. 되도록 최신 기능인 java.time패키지의 기능을 사용하는 것을 추천한다. 

  • Date 클래스 - JDK1.0 부터 제공 (현재 대부분 메서드가 deprecated됨)
  • Calendar 클래스 - JDK1.1 부터 제공
  • java.time패키지 - JDK1.8 부터 제공
    (LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Period 등 클래스와 날짜 관련 열거형, 패키지 들을 포함)

*패키지는 여러 클래스들을 하나로 묶은 것. (=디렉터리)
*deprecated : 중요도가 떨어져 더 이상 사용되지 않고 앞으로는 사라지게 될 (컴퓨터 시스템 기능 등)

728x90
Comments