바쁘다.
몸도 바쁜데, 마음도 좀 바쁘다.
42서울을 진행하면서 C 함수 구현도 구현이지만, 해야 하는 일에 비해 몸뚱이가 하나 뿐인게 흠이다...
오늘은 점프 투 파이썬 이라는 교재의 덕을 많이 봤다.
막상 파이썬을 시작하면서, 파이썬 공부를 하는 이들마다 말하는 '파이썬스러움'을 가진 코드를 만들기가 쉽지 않다.
C와의 차이점이 처음엔 그닥 크지 않다고 생각했다. 하지만 생각해보면 엄청난 차이가 있었다. 문장에서 필요한 성분이 달랐고, 형식적으로 명확해야만 하던 C와는 다른 '자연스러움'이 파이썬에 있다는 걸 느낄 수 있었다.
두개다 배우다 머리 터지는거 아니겠지...?
{
}
이 두가지 요소를 쓰지 않고, 들여쓰기
가 문장을 구분하는 핵심이 된다. 들여쓰기에 따라 해당 명령에 따라 연속적으로 오는 명령은 들여쓰기 안으로 들어가서 있어야 한다. money = True
if money :
# 주석을 이렇게 적어야 아래의 print문장이 작동함.
print("택시 타셈")
else :
# 이렇게 적으면 위의 else문은 이미 명령이 끝난 것이고, print는 연속되지 않는다.
print("걸어가셈")
...
> 택시 타셈
a, b = map(int, input().split())
if (a > b):
print(">")
elif (a < b):
print("<")
else:
print("==")
# 개선버전
a, b = map(int, input().split())
if a == b:
print("==")
else :
print(">" if a > b else "<")
if 문을 이용하는 가장 쉬운 문제. 조건에 따라 넣어주면 된다. 이때, 여러 조건을 통해 분기로 나눌 시에 사용 가능한 것이 "elif"다.(c의 else if 와 똑같다.)
c와의 차이점은, 해당 명령이 실행될 시 해야할 명령의 구분을 : 로 한다는 점.
또한, 개선버전의 경우 다른 사람들의 것을 보고 깨달은 부분이다. print 함수 자체에다가 명령문 자체를 넣을 수가 있고, 분기를 줄인 만큼 실행속도가 빨라진다... 이게 바로 "파이썬스러움" 인건가 싶다.
import sys
a = int(sys.stdin.readline())
if 90 <= a:
print("A")
elif 80 <= a <= 89:
print("B")
elif 70 <= a <= 79:
print("C")
elif 60 <= a <= 69:
print("D")
else:
print("F")
해당 내용은 성적에 따라 구분되는 여러 조건을 입력하는 방법에 대한 문제다. 이때 포인트는 elif의 활용이다.
이번에 추가적으로 알게된 입력 방법은 sys.stdin.readline()이라는 명령어다. 해당 명령어 사용시 백준 코딩 등에서 생기는 타임아웃을 해결할 수 있다. 이유는 결론적으로 말하면, 기존의 input 내장함수에 비해, prompt message 출력과 개행문자 삭제를 안하고 바로 인식해버리기 때문이다. 자세한 내용은 하단 블로그 링크를 참고하면 좋다.
sys.stdin.readline()이 왜 더 빠를까?
prompt message란?
# 윤년 구하기
# 조건 1. 4의 배수이지만 100의 배수는 아닐 때
# 조건 2. 400의 배수일 때
import sys
a = int(sys.stdin.readline())
if (((a % 4) == 0 & (a % 100) != 0) | (a % 400 == 0)):
print("1")
else:
print("0")
해당 문제는 생각보다 시간이 걸렸다. 이유는 간단한데, () 사용에 있어 어떤 조건과 어떤 조건이 함께 묶여야 하는지 대충 읽었을 때 잘못 해석(...) 해버렸기 때문이다.
# 사분면 고르기
import sys
print("x값을 입력하시오.")
x = int(sys.stdin.readline())
print("y값을 입력하시오.")
y = int(sys.stdin.readline())
if (x > 0):
if (y > 0):
print("1")
elif (y < 0):
print("4")
elif (x < 0):
if (y > 0):
print("2")
elif (y < 0):
print("3")
# 사분면 고르기(short coding)
x = int(input("x 값을 입력하시오.\n"))
y = int(input("y 값을 입력하시오.\n"))
if x > 0:
print(1 if y > 0 else 4)
elif x < 0:
print(2 if y > 0 else 3)
이 문제에서는 특히나, 파이썬 스러움을 잘 할 줄 아는 사람들에 대해 볼 수 있던 부분이다. 사분면 중 입력된 좌표에 따라 어디로 가는지를 정리한 내용이다. 상단 작성이 내가 한 부분이고, C 냄새(?)가 물씬 난다.
이에 반해 아래는 다른 사람이 작성한 내용이고, 이를 살짝 바꿨다.
한가지 특이 사항으로 print문 내부에 조건절 작성시 print (값1 if문 else 값2)를 사용한다는 점이다.
# 알람시계
hh, mm = map(int,input().split())
mm_r = 0
if mm - 45 < 0:
hh -= 1
if hh < 0:
hh = 24 + hh
mm = (mm - 45)
mm_r = 60 + mm
print ("{0} {1}".format(hh, mm_r))
else :
print("{0} {1}".format(hh, mm - 45))
# 알람시계(short coding)
# 방법1
a,b=map(int,input().split());x=a*60+b-45;print(x//60%24,x%60)
# 방법2
a, b = map(int, input().split())
print((a-(b<45))%24, (b-45)%60)
숏 코딩에서 내공이 느껴진다.방법 1과 2는 유사하지만, 접근 방법이 다르다. 1번은 아예 a, b로 받는 시간과 분을 하나의 숫자 덩어리로 만든 뒤 처리를 했다. 하지만 2번은 (b < 45) 라는 부분으로 "조건절"을 만드는 방식을 활용했다. 참이되면 1이 나와 a에서 1시간을 뺄 것이고 거짓이면 0이 되니 빠지는 시간 없이 작동하게 되는 것이다.
새로운 것들을 꽤 많이 배웠다.
boolean
으로 사용이 가능하다는 점은, 생각이상으로 신박하다고 느낀다.이제 if문 하나 진득하게 바라보면서 문제를 풀어봤다. 앞으로 바뻐지는데 계속 할 수 있을지 다소 애매함(?) 을 느끼긴 하고 있다. 그래도 42서울에서 원하는 것이 점점더 완벽하고 스스로 디테일해지는 것이니까, libft 자체에도 시간을 디테일하게 쏟는 방식으로 계속 이어가야겠지. (물론, 다음주 초에는 끝내야 한다ㅋㅋ...)