놀랍게도 여전히 2차원 배열의 벽을 극복하지 못해 454점의 벽을 깨지 못하고 있어 따로 관련 포스팅을 쓸 계획이 생겼다는 슬픈 소식

포스팅 작성 시점인 현재까지의 진도 과정 인증. 빨간색 사이 있는 회색은 변수의 영역 파트인데, 약간 고난이도 연습문제 두 개가 도무지 풀리지 않아 일단 보류하고 학습을 진행하다 보니 재귀함수 부분까지 진행을 완료했다. 한 번 연습할 때 제대로 끝내고 싶어 일일 학습 목표를 가장 높은 '필사적으로' 단계를 선택했는데, 문제를 푸는 과정이 어려울 때가 조금 (많이) 있어도 한 번 시작하면 재미가 붙으니까 목표치인 240XP를 금방 채우게 된다. 그러나...

이번 주차는 해야 한다는 생각도 들지 않고 스스로를 잘 돌보지 못하는 무기력하고 게을렀던 날들이 많았던 한 주였다. 거의 집 밖을 안 나가고 칩거 생활을 하다 보니 며칠간 씻지도 않고, 밤낮이 바뀌고, 먹고 자고 게임하고 폰하기의 반복이었다. 나는 사실 의욕에 불타서 내가 정한 루틴이며 계획을 어떤 때는 잘 수행하다가 또 어떤 때는 아예 아무것도 안 하고 해야 할 일만 하고 늘어지는 패턴을 너무 자주 반복하는 성인 ADHD 환자이기 때문에, 정신과에서 진료를 받고 약을 타 먹는 것도 중요하지만 행동 면에서 무언가를 꾸준하게 할 필요성이 있었기 때문에 이 챌린지를 신청한 것도 있다. 지난 주차에는 게임하다 정신을 차리고 대충 자정에 시간 맞춰서 글을 쓰기는 했지만, 이제부터는 배우는 내용들의 난이도도 조금씩 높아지기도 하고 이 챌린지를 하면서 느끼고 배운 것들을 조금이라도 더 기록하고 싶다.

4의 배수이면서 100의 배수이지만 또한 400의 배수라면 윤년이라는 조건식 자체부터가 사람 헷갈리는데 이에 해당하는 조건문 때문에 채점에서 틀렸던 문제이다. 또한 2월의 경우는 윤년을 판별해야 하기 때문에 조건문의 행 수가 다른 월보다 더 길어질 수밖에 없기 때문에, 코드 구조를 잘 짜는 게 중요했던 문제.
Y, M, D = map(int, input().split())
def season_date(Y, M, D):
if M >= 3 and M <= 5:
if M % 2 == 0:
if D >= 1 and D <= 30:
print("Spring")
else:
print(-1)
else:
if D >= 1 and D <= 31:
print("Spring")
else:
print(-1)
elif M >= 6 and M <= 8:
if M == 6:
if D >= 1 and D <= 30:
print("Summer")
else:
print(-1)
else:
if D >= 1 and D <= 31:
print("Summer")
else:
print(-1)
elif M >= 9 and M <= 11:
if M % 2 == 0:
if D >= 1 and D <= 31:
print("Fall")
else:
print(-1)
else:
if D >= 1 and D <= 31:
print("Fall")
else:
print(-1)
elif M == 12 and M == 1:
if D >= 1 and D <= 31:
print("Winter")
else:
print(-1)
elif M == 2:
if Y % 4 == 0 or (Y % 4 == 0 and Y % 100 == 0 and Y % 400 == 0):
if D >= 1 and D <= 29:
print("Winter")
else:
print(-1)
else:
if D >= 1 and D <= 28:
print("Winter")
else:
print(-1)
else:
print(-1)
season_date(Y, M, D)
처음에 제출하고 채점에서 틀렸던 코드인데, 우선 12월에서 2월까지 겨울로 지정하지만 2월은 윤년 여부를 먼저 판별해야 하므로 제외하고 12월과 1월만 함께and 연산자로 묶은 것부터가 문제였다. 봄, 여름, 가을의 경우에는 M월부터 M월까지를 and 연산자를 통해 설정할 수 있고 그 중 하나를 조건에서 택하면 되지만, 12월에서 1월까지인 경우 12월이나 1월 중에 하나여야 하기 때문에 or 연산자를 사용하였어야 했다.
그리고 2월의 윤년 여부를 판별하는 조건식을 설정할 때, 그냥 Y가 4의 배수이기만 하거나 Y가 4의 배수이고 100의 배수이지만 400의 배수인 것으로만 설정하고 4의 배수이면서 100의 배수이면 윤년이 아닌 것은 전혀 조건식에 반영되지 않았다(사실 당시 문제를 풀면서 윤년 조건에 대한 혼란을 느꼈는데, 정리를 하면서 다시 보니 이 조건이 그렇게 혼란스럽지는 않았구나 싶다). 따라서 아래의 방식으로 코드를 수정하였다.
Y, M, D = map(int, input().split())
def season_date(Y, M, D):
if M >= 3 and M <= 5:
if M % 2 == 0:
if D >= 1 and D <= 30:
print("Spring")
else:
print(-1)
else:
if D >= 1 and D <= 31:
print("Spring")
else:
print(-1)
elif M >= 6 and M <= 8:
if M == 6:
if D >= 1 and D <= 30:
print("Summer")
else:
print(-1)
else:
if D >= 1 and D <= 31:
print("Summer")
else:
print(-1)
elif M >= 9 and M <= 11:
if M == 10:
if D >= 1 and D <= 31:
print("Fall")
else:
print(-1)
else:
if D >= 1 and D <= 30:
print("Fall")
else:
print(-1)
elif M == 12:
if D >= 1 and D <= 31:
print("Winter")
else:
print(-1)
elif M == 1:
if D >= 1 and D <= 31:
print("Winter")
else:
print(-1)
elif M == 2:
if ((Y % 4 == 0) and (Y % 100 != 0)) or (Y % 400 == 0):
if D >= 1 and D <= 29:
print("Winter")
else:
print(-1)
else:
if D >= 1 and D <= 28:
print("Winter")
else:
print(-1)
else:
print(-1)
season_date(Y, M, D)
코드를 수정할 당시에는 12월과 1월의 조건문을 따로 작성했는데, 정리를 하고 나서야 or 조건식을 사용했어야 했다는 게 떠올랐음.

처음에 최소공배수 구하는 math 라이브러리 쓰면 뚝딱 끝나잖아! 착각하고 대충 구글링한 내용을 바탕으로 문제를 풀었는데 1개의 값이 주어질 때를 고려하지 못하고 코드를 작성해서 런타임 에러가 발생했던 문제.
from math import gcd
n = int(input())
n_arr = list(map(int, input().split()))
def gongbaesu(arr):
def lcm(x, y):
return x * y // gcd(x, y)
while True:
arr.append(lcm(arr.pop(), arr.pop()))
if len(arr) == 1:
return arr[0]
print(gongbaesu(n_arr))
y의 값이 주어지지 않기 때문에 런타임 에러가 발생했던 것. N개의 최소공배수를 구한다고 할 때 그 N개가 1개가 될 수 있으므로, 이를 반영해서 코드를 수정했다.from math import gcd
n = int(input())
n_arr = list(map(int, input().split()))
def gongbaesu(arr):
answer = arr[0]
for num in arr:
answer = answer * num // gcd(answer, num)
return answer
print(gongbaesu(n_arr))
math 라이브러리와 문법 대한 학습과 더불어 기본적인 수학 공부 좀
챌린지가 끝나고 정말로 이만큼 성장했으면 좋겠...다....