2019년 1월 9일 수요일

#3 알고리즘 연습 - 요일 찾기/JAVA


2016년(요일 찾기)


문제 설명
2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT
입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 TUE를 반환하세요.
제한 조건
  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

입출력 예

abresult
524TUE




나의 코드⭐
                 (library를 쓰지않고 문제를 푸는 방법은 
                  #3알고리즘 연습 -요일찾아주기 -PYTHON의 아이디어를 참고)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;
import java.time.DayOfWeek;

class Solution {
  public String solution(int a, int b) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy"); //DateTimeFormatter는 자주쓰이는 다양한 형식 정의
                                                                             ofPattern은 출력형식을 정의하는것으로 
                                                                             19/4/2019 이런식으로 정의해준 것이다
    LocalDate date = LocalDate.parse(String.valueOf(b)+"/"+String.valueOf(a)+"/2016", formatter); LocalDate는 참조변수로 date의 형식을 날짜로 표현
                                                                                                  b와 a를 STring으로 변환하여 formatter형식에 맞춰
                                                                                                  parse메서드로 String을 date로 변환해준다 
DayOfWeek dow = date.getDayOfWeek(); //요일을 가져와 dow에 저장 (dow는 DayOfWeek를 참조변수로사용) return dow.getDisplayName(TextStyle.SHORT, Locale.US).toUpperCase(); //DayOfWeek의 getDisplayname method를 통해 date를 String으로 출력
                                                                           toUpperCase를 사용해서 출력값을 모두 대문자로 변환

  }
}


다른 풀이⭐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;

class Solution{
    public String getDayName(int month, int day){
        Calendar cal = new Calendar.Builder().setCalendarType("iso8601") //Calendar객체를 빌더패턴을 이용해 생성하고
                      .setDate(2016, month - 1, day).build();          setter를 이용해 iso8601(날짜,시간관련국제표준)
로 CalendarType을 설정하고 Date를 설정해줬다
        return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, new Locale("ko-KR")).toUpperCase();
    }                                          #Calendar의 getDisplayName(int field, int style, Locale locale)
                                                이 되고 return하는 형식으로는 String과 MAP(String, integer)가 잇다.
                                                Calendar의 field DAY_OF_WEEK 를 argument값으로 넣어준것을 알수 있다.
}



추가로 알아두면 좋을 것들

1-1                          

날짜를 나타내고 싶으면 LocalDate

날짜와 시간을 담고 싶으면 : LocalDateTime

시간만 나타내고 싶으면 LocalTime

1-2                          

String -> LocalDate

LocalDate.parse("YYYYMMDD", DateTimeFormatter.BASIC_ISO_DATE); 

LocalDate -> String

LocalDate.of(YYYY,MM,DD).format(DateTimeFormatter.BASIC_ISO_DATE);


2. DayOfWeer.getDispalay


getDisplayName(TextStyle, Locale)

날짜를 위와 같은 방법으로 String으로 나타낼수있는데  
TextStyle에는 FULL,NARROW,SHORT 등이 있고
Locale의 field로는 많은 나라와 언어들이 있기떄문에 구글링을 통해 찾도록하자

3 .빌더패턴에 대해 간단히


디자인패턴의 한 종류로 생성자가 많은 인자를 받는 경우 or 선택적으로 인자를 받는경우에 효율적으로 사용할 수 있다. 빌더객체를 만든 후 빌더객체에 정의된 설정 메서드를 이용하여 인스턴스를 생성하는 것

4 . Getter 와 Setter는 왜 쓸까


Private으로 선언된 변수에 접근 할수 있게 한다(이 argument의 검증절차를 거쳐 무결성을 유지할수 있다.


출처: 프로그래머스(https://programmers.co.kr)

가장 많이 본 글