금일의 코드카타 문제 (2016년) 을 풀면서 도대체 윤년이란게 뭔가?
그리고 날짜관련 내장함수를 내가 외우고 있어야지 풀 수 있는문제인가? 라는 생각이 들었다.
날짜 관련 문제는 몇번 봐왔기 때문에 언젠가 필요할 때가 올거라 생각하므로
이 부분에 대해 정리해본다.
윤년
윤년의 개념은 일반적으로 사용되는 달력 시스템에서 사용하는 "태양력" 인 그레고리력을 따르면서 나왔다고합니다.
자세한 사항은 생활꿀팁의 답변을 통해 얻을 수 있었습니다.
>이것은 태양 주위를 도는 지구의 공전과 정렬하고 달력 연도를 대략 열대년과 동기화하도록 설계되었습니다. 지구가 태양 주위를 한 바퀴 도는 데 걸리는 시간입니다.
그레고리력에서 대부분의 달은 30일 또는 31일이지만 예외가 있습니다. 4월, 6월, 9월, 11월은 각각 30일이며 2월을 제외한 나머지 달은 31일입니다. 2월은 가장 짧은 달이며 평년은 28일입니다. 그러나 4년에 한 번씩 오는 윤년에는 2월이 29일까지 있다. 이 조정은 태양년의 길이가 약 365.25일이라는 사실을 설명하기 위해 만들어졌습니다.
윤년이 필요한 이유는 지구가 태양 주위를 공전하는 데 정확히 365일이 아니라 약 365.25일이 걸리기 때문입니다. 4년마다 하루를 더 추가함으로써 우리는 추가 분기일을 설명하고 달력 연도를 계절과 일치하도록 유지할 수 있습니다.
4월, 6월, 9월, 11월이 30일이며 2월은 윤년에는 29일 그 외에는 28일이라는 것을 어떻게 외울 수 있을까? 생각한 도중
떠오른 게 있었다, 초등학교 시절에 배웠던 기억이 나는데 바로 주먹을 이용한것.
7~8로 넘어갈 때 제자리에서 다시한번 세야 한다는것만 떠올리면 무난하게 암기가 가능할것이다.
이렇게 해서 오늘의 코드카타 2016년을 내장함수 없이, 적당한 상식의 보유만으로 풀어낼 수 있을 방법을 찾아내었다.
내장함수, 라이브러리 없이 푼 풀이
class Solution {
public String solution(int a, int b) {
String answer = "";
String[] weekstr = {"FRI","SAT","SUN","MON","TUE","WED","THU"};
int[] dayOfMonth = {31, 29, 31,30,31,30,31,31,30,31,30,31};
int dayAfterStart = 0;
//a-1월까지의 일수를 더해준다.
for(int i=0; i<a-1; i++){
dayAfterStart += dayOfMonth[i];
}
//b일을 더하고 1일을빼줌. 1월1일부터 시작했으므로
dayAfterStart += b;
dayAfterStart--;
return weekstr[dayAfterStart%7];
}
}
풀이 : 어차피 요일, 각 월별 일수는 상수범위 내로 정해져 있기 때문에 미리 배열로 선언해서 사용해도 성능에 지장이 없다
1일이 금요일이며 추후에 %7 연산으로 요일을 찾을 거기때문에 0index를 "FRI"로 시작하는 요일 문자열 배열선언
목표월인 a월의 직전달 a-1월까지의 일수를 그냥 더해준다, 그리고 목표일인 b일을 바로 더해주고
1월1일부터 시작했으므로 1일을 dayAfterStart에서 빼서 맞춰준다
그리고 weekstr의 인자로 dayAfterStart%7의 값을 전달,
dayAfterStart%7의 의미, 1일이 금요일이므로 weekstr의 범위인 7을 초과할 경우 다시 0 index로 맞춰주는 과정을
함축한것.
내장함수, 라이브러리를 사용한 방식
import java.time.LocalDate;
import java.time.DayOfWeek;
class Solution {
public String solution(int a, int b) {
String answer = "";
String[] weekStr = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
LocalDate date = LocalDate.of(2016,a,b);
DayOfWeek dow = date.getDayOfWeek();
//DayOfWeek의 getValue()는 월요일=1, 일요일=7의 값을 리턴.
int daynum = dow.getValue();
return weekStr[daynum-1];
}
}
LocalDate와 DayOfWeek 클래스가 존재한다, 년, 월, 일 값을 전달하여 LocalDate객체를 생성하고
LocalDate 객체의 getDayOfWeek() 메소드를 실행하면 DayOfWeek 객체가 생성되고
getValue()메소드를 통해 월요일은 1, 일요일은 7 값을 리턴한다고 한다,
다만, 무슨 절차가 그냥 딱봐도 외워야하거나 인터넷에 검색해서 사용해야 하듯이 고정되어있다는 것을 느낄 수 있다.
물론, 알고있다면 편하겠지만 문제풀이 당시에 인터넷 검색이 불가능하거나 이것만 외우고 다른 방식은 생각하지 않았는데 순간적으로 기억이 나지않는다면 어찌 할 수가없을것이다.
MySQL의 MAX() 와 LIMIT
코딩테스트 연습 - 최댓값 구하기 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
가장 최근에 들어온 동물 데이터 하나를 추출하는 문제로
떠오른 대로 풀었다.
SELECT DATETIME 시간
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1;
물론 답은 맞았지만, 문제 카테고리가 MAX, MIN, SUM 이고 문제명도 최댓값 구하기로
뭔가 이 문제가 의도한 답이 아니라는거를 느껴 다른 풀이를 찾아보았다.
문제가 의도한 풀이
SELECT MAX(DATETIME) AS 시간
FROM ANIMAL_INS;
MAX() 함수 하나만을 사용하면 해결이 되는거였다.
MAX()함수는 해당 컬럼에서 최댓값 데이터 하나를 가져오는 함수이지만, 날짜에서 사용할 경우
가장 최근의 날짜 하나를 가져온다고한다, 따라서 기존 풀이에서 ORDER BY로 날짜 데이터를 정렬 할 필요도 없고
LIMIT으로 데이터 하나만 가져올 필요도 없게 되는것이다.
jQeury 클릭 이벤트 처리
1. click()
<div class="container">
<ul class="myList">
<li>apple</li>
<li>pineapple</li>
<li>banana</li>
</ul>
</div>
<!--ul 리스트에 function을 바인딩 시켜 목록을 누르면 삭제가 될 것이다-->
<script>
$('.myList').children().click(function(){
$(this).remove();
});
</script>
여기에서
$('myList').append('<li>peach</li>');
이렇게 새로운 li를 동적으로 추가해 준다고 가정해보면, 위에서 선언했던 click()의 메소드는 실행되지않는다.
click()의 메소드는 처음에 페이지 로딩때 선언되어 있던
element에 이벤트를 바인딩하고 나서는 더이상 동적으로 바인딩을 하지 않기 때문이다.
2.on("click",..)
이 문제는 on("click",..)을 이용해 해결할 수 있다. 부모 태그에 연결된 이벤트를 자식 요소들에게 delegate 시키는 식으로
동작한다고 한다.
이렇게 하면, 동적으로 요소가 추가되더라도 새롭게 추가된 요소에 그대로 이벤트가 전달되게된다.
$('myList').on('click', function(){
$(event.target).remove();
});
우리 팀의 팀페이지 좋아요 버튼의 동작 코드들을 살펴보며 생긴 의문에 대해 정리를 하였다.
페이지에는 click()메소드를 사용하여 구현되어있었는데, 별다른 변화 없이 동적인 페이지를 생성하였기 때문에
click()메소드를 사용했다고 볼 수 있다.
이게 좋아요 버튼이 하나만 있어서 그렇지 만약 방명록을 예로들면, 방명록들은 동적으로 생겨나고 줄어들기 때문에
방명록에 click()메소드를 사용하여 실행함수를 설정한다고 한다면, 그 상위 div에 on('click', ...) 메소드를 사용하여
생성, 삭제 처리를 할 수 있겠다.
-> + 실제로 방명록 동작 코드들을 살펴보니 역시나 on('click', ..)메소드를 사용하여 구현된 코드를 볼 수 있었다.
'부트캠프 > TIL' 카테고리의 다른 글
[부트캠프] TIL - MySQL(CONCAT,SUBSTR), window.location.reload() (1) | 2024.07.22 |
---|---|
[부트캠프] TIL - Java의 Call by Value, Call by Reference (2) | 2024.07.20 |
[부트캠프] TIL - 링크 태그<a> 및 파일 경로 (0) | 2024.07.17 |
[부트캠프] TIL - GitHub Pages, GitHub flow (0) | 2024.07.15 |
[부트캠프] TIL - Git 특강 (0) | 2024.07.15 |