티끌모아 로키산맥 🏔
search
로ᄏl
배움에 끝은 없다... 개발 또한 그러하다.
Today
Yesterday
Q. 문제
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년은 윤년입니다. 2월29일 포함 366일
2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)
> 접근방법 1 (fail)
최근 영화예매 웹 사이트 만들기 (미니) 프로젝트를 진행하면서 OracleDB의 data 함수를 받아와서 JAVA로 처리하면서 다뤘던 date 함수를 이용해보고 싶었다.
Date date = new Date(); // 현재 날짜 생성
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
int year = 2016;
int month = a; // 월에 입력되는 파라미터 a
int day = b; // 일에 입력되는 파라미터 b
String inputdate = year+"-"+a+"-"+b;
date = sdf.format(inputdate);
...
이런 방식으로 처리해서 date의 요일을 출력하는 메소드(어디서 지나가는 포스팅중에 본 기억이 났다)를 사용하여 처리할려고 하였으나
format 안의 인자로 Date 타입이 필요한데... inputdate의 값을 2016-aa-bb 형식으로 유지하면서 타입을 date로 바꿀 방법을 찾지 못하였고, 다른 방법이 필요함을 느꼈다.
> 접근 방법 2
2016년이 윤년인걸 고려하여 각 달의 일수를 array 타입으로 저장한 뒤, 파라미터 a(month) , b(day)에 따라 for 문을 통해 (2016년) 1월 1일 금요일을 기준으로 a월 b일 까지의 일수를 측정하여 7로 나눈 나머지를 조건에 따라 나눠서 a월 b일의 요일을 구할 수 있을 것이다.
가장 쉽게 접근할 수 있는 방법이라 생각했기에 따로 코드를 짜보지는 않았다.
> 접근 방법 3 (by. Calendar 클래스)
2의 방법으로 문제를 풀기 싫어서 적절한 API를 찾아보았다. 결론은 Calendar의 get함수를 이용해서 대한 요일을 알 수 있다는 것을 알게 되었고, Calendar 클래스를 이용해서 문제를 풀어보았다.
import java.util.Calendar;
import static java.util.Calendar.*;
public class Solution {
public String solution(int a, int b) {
Calendar cal = Calendar.getInstance();
cal.set(YEAR, 2016);
cal.set(MONTH, a - 1);
cal.set(DATE, b);
cal.set(HOUR, 0);
cal.set(MINUTE, 0);
cal.set(SECOND, 0);
cal.set(MILLISECOND, 0); // millisecond 요소를 꼭 0 으로 설정해줘야한다 !
int daynum = cal.get(DAY_OF_WEEK);
String kordate = "";
switch (daynum) {
case 1:
kordate = "SUN";
break;
case 2:
kordate = "MON";
break;
case 3:
kordate = "TUE";
break;
case 4:
kordate = "WEN";
break;
case 5:
kordate = "TUR";
break;
case 6:
kordate = "FRI";
break;
case 7:
kordate = "SAT";
break;
default:
kordate = "알수없음";
break;
}
return kordate;
}
Calendar의 객체 cal 을 생성한다. (일단 오늘 날짜의 instance를 만든다)
cal의 값을 원하는 값으로 변경한다. (※ 주의 set 함수를 이용해서 년,월,일 만 변경하면 안된다. 시,분,초 는 물론 millisecond 성분도 초기화 시켜줘야 한다. 코드에서는 0으로 초기화했으나 결과값에 영향이 없으므로 임의의값을 대입해도 상관없을 것 같다)
특정 값을 지정했다면 get함수로 get(DAY_OF_WEEK); 를 사용해서 1 ~ 7 중 한 개의 값을 받을 수 있고, 1 (일요일) 부터 차례대로 2(월요일), 3(화요일) .... 7(토요일) 의 값과 매칭된다. 조건문을 통해서 각 요일에 맞는 String 값으로 반환하면 이번문제를 해결할 수 있었다.
프로그래머스 코딩 테스트 연습문제: 타겟 넘버 (DFS/BFS) (2) | 2019.10.19 |
---|---|
프로그래머스 코딩테스트 연습: 문자열 내 마음대로 정렬하기 (0) | 2019.09.01 |
프로그래머스 코딩테스트 연습: 나누어 떨어지는 숫자 배열 (0) | 2019.08.30 |
프로그래머스 코딩테스트 연습: 같은 숫자는 싫어 (0) | 2019.08.29 |
프로그래머스 코딩테스트 연습: 가운데 글자 가져오기 (0) | 2019.08.28 |