공부하는허딩크 : https://www.youtube.com/live/ecgQgeMLyYI?feature=shared
일단 1시간 40분 정도 고민을 했는데 100분동안 감을 잡지 못해서 포기했다.
구독자분께서 30분 이상 걸리는 문제는 그냥 답을 보고 이해하는게 좋다는 조언이 있었는데 이게 맞는것 같다.
최근에는 문제를 해결하는 속도가 처음 공부를 시작할때 보다는 좋아졌다고 생각하지만 그래도 1문제에 1시간 이상 고민하고 감도 못잡는 것은 너무 비효율 적인 것 같다.
<100분동안 고민한 결과 : 조금은 감을 잡은 것 같지만 문제해결까지는 거리가 멀다.>
이게 어렵네;;;; 정답을 봐도 잘 이해가 가지 않는다......
def solution(a, b):
answer = ''
month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
day = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
extra = month[a - 1] - 28
plus = b % 7 + (7 - extra)
minus = b % 7 - (extra)
if a == 1:
if b % 7 < extra:
answer += day[plus]
else:
answer += day[minus]
elif a == 5:
if b % 7 < extra:
answer += day[plus]
else:
answer += day[minus]
return answer
"""
1. a(월)을 받아서 1일의 시작점이 무엇인지 확인한다.
2. b(일)을 받아서 계산한다.
ㄴ 1일은 Fri, index = 5
ㄴ range(7)로 for문을 돌리면 0~6까지 나오는데 1이나오면 5가 나오게끔 조정
ㄴ 1/8/15.. = 5, 2/9/16.. = 6, 3/10/17.. = 0
ㄴ 1월 31일 - 28일 = 3일이니까 3일 (0, 1, 2) + 4를 해주고 나머지는 -3을 해준다.
"""
#1시간 동안 고민해서 아래와 같이 미완성 코드가 나옴
def solution1(a, b):
answer = ''
#month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
day = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
if a == 1:
if b % 7 == 1:
dday = 4
elif b % 7 == 2:
dday = 5
elif b % 7 == 3:
dday = 6
answer += day[dday]
return answer
""" < 아래의 생각까지 1시간 고민>
윤년이 뭔지 모르지만 일단 해보자 (2월 29일 카운팅인가?)
1월1일 금요일
1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
31 29 31 30 31 30 31 31 30 31 30 31
일 월 화 수 목 금 토
0 1 2 3 4 5 6
X X X X X 1 2
3 4 5 6 7 8 9
1. 월을 받아서 시작점을 체크해준다.
2. 일을 받아서 처리한다.
d%7 == 0이면 MON이 나오게끔
만약 1월을 받으면
"""
<내 코드_첫번째>
다른 사람들 코드를 봐도 잘 이해가 가지 않고 일단 아래의 코드로 통과는 되었는데 아직도 100%이해는 가지 않는다.
def solution(a, b):
answer = ''
month = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
days = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"]
day = b
for i in range(a):
day += month[i]
answer += days[day % 7]
return answer
<내 코드_두번째>
음....... 1월1일이 Fri로
1%7 = 1
2%7 = 2
3%7 = 3
4%7 = 4
5%7 = 5
6%7 = 6
7%7 = 0 이니까..(스스로도 이거까지 생각을 했었는데.... 조금만 더 생각을 전환할껄...)
나머지가 1이면 Fri가 나오게 days리스트를 정렬한다.
days = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"]
이렇게 하면 나머지 값으로 바로 days의 인덱스에 접근할 수 있다.
그 다음 1월, 2월 3월~12월까지의 일수를 리스트로 만든다. 윤달이 아니면 2월은 29가 아닌 28이 된다.
즉 1월에는 그냥 d의 값으로 %7을 해서 나머지를 구한 후 days에서 찾으면 되고,
2월에는 1월의 총 일수 + b의 값을 % 7을 해서 days에서 찾으면 된다.
def solution(a, b):
month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
days = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"]
return days[(sum(month[:a - 1]) + b) % 7]
<다른사람 풀이 참고>
파이썬의 장점인 모듈을 활용해서 깔끔하게 해결했다.
import datetime
def getDayName(a,b):
t = 'MON TUE WED THU FRI SAT SUN'.split()
return t[datetime.datetime(2016, a, b).weekday()]
datetime설명 : https://ctkim.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-datetime-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EA%B0%80%EC%9E%A5-%EB%A7%8E%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%ED%95%A8%EC%88%98
<datetime 상세>
import datetime
now = datetime.datetime.now()
print("현재 날짜와 시간 : ", now)
print("현재 시간(문자열) : ", now.strftime("%Y-%m-%d %H:%M:%S"))
dt = datetime.datetime(2021, 9, 1, 12, 30, 45)
print("생성된 날짜와 시간 : ", dt)
tomorrow = now + datetime.timedelta(days=100)
print("내일 날짜와 시간 : ", tomorrow)
date_string = "2021-09-01 12:30:45"
dt = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print("변환된 dt : ", dt)
print("다른 포맷 : ", dt.strftime("%Y년%m월 %d일 %H시 %M분 %S초"))
date = now.date()
print("date : ", date)
print("date 다른 포맷 : ", date.strftime("%Y년 %m월 %d일"))
time = now.time()
print("time : ", time)
print("time 다른 포맷 : ", time.strftime("%H시 %M분 %S초"))
new_datetime = now.replace(year = 2022, month = 1, day = 1, hour = 1, minute = 30, second = 50)
print("now :", now)
print("new :", new_datetime)
t = 'MON TUE WED THU FRI SAT SUN'.split()
weekday = now.weekday()
print("요일(정수) : ", weekday)
print("요일 : ", t[weekday])
isoweekday = now.isoweekday()
print("ISO요일 : ", isoweekday)
timestamp = now.timestamp()
print("timestamp : ", timestamp)
new_datetime = datetime.datetime.fromtimestamp(timestamp)
print("변환 timestamp : ", new_datetime)