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년 날짜를 계산하는 문제이다.
당연하게도 가장 먼저 떠오른 것은 Java의 날짜 객체였는데, 요일을 많이 써본 것은 아니라 이번 기회에 사용 방법을 익혔다.
getDayOfWeek() 메소드는 월요일부터 일요일까지 1~7을 반환하기 때문에 index로 쓰려면 -1을 해줘야했다.
import java.time.DayOfWeek;
import java.time.LocalDate;
class Solution {
public String solution(int a, int b) {
String[] weekArr = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
LocalDate inputDate = LocalDate.of(2016, a, b);
int weekNum = inputDate.getDayOfWeek().getValue() -1;
return weekArr[weekNum];
}
}
이번엔 문제가 너무 길어 적지 않겠다.
실행 시간 때문에 애를 먹었다. 약수 구하는 문제는 예전에 풀어봤었는데 너무 오랜만이라 푸는 방법을 까먹었다.
처음엔 연산을 반으로 줄이려고 Math.floor(i/2)를 했었는데 그래도 5만번 반복하는 것은 무리였나보다.
결국 찾아본 결과, 대응하는 약수 (a,b)에 대하여 a >= b (단, a>b)이기 때문에 작은 쪽의 제곱만 넘지 않으면 계산이 가능하다는 것을 이해했다.
class Solution {
public int solution(int number, int limit, int power) {
int answer = 0;
for(int i = 1; i <= number; i++){
int str = 0;
for(int j = 1; j*j <= i; j++){
if(i % j == 0){
str++;
if(j != i / j){
str++;
}
}
}
answer += str > limit ? power : str;
}
return answer;
}
}