본문 바로가기

코딩

[파이썬] 책 파이썬 챌린지 공부로그 #1

파이썬 챌린지 | 니콜라 레이시 지음 | 황반석 옮김 | 제이펍 | 2021

프로그래머가 되고 싶어서 호기롭게 맥북을 산지도 한 달이 지났지만, 무엇하나 만든 것은 없고 튜토리얼만 이것저것 둘러보며 방황만 했다. 이대로 가다가는 죽도 밥도 안될 것 같아 프로그래머를 포기해야하나 싶었다. 그러던 때 동네 도서관에서 파이썬 챌린지라는 책을 발견했다. 수많은 튜토리얼을 전전한 나에게는 이런 예제 위주로 되어있는 강의책이 더 효과가 있겠다 싶어 얼른 책을 들었다.

 

이 책도 그 수많은 튜토리얼 중 하나일까? 라는 의구심이 머리를 스쳐 지나갈 때 예전에 본 기록과 꾸준함의 중요성을 알려준 유튜브 영상이 떠올랐다.

https://youtu.be/V9AGvwPmnZU

좋아 나도 이 분처럼 기록을 해야겠다 싶었다. 당장은 깃헙이 뭔지도 모르고, 뭐를 모르는지도 모르지만, 일단 공부를 기록하겠다.

 

[챌린지 0~11 기초]

기초 장에서는 파이썬 설치와 실행 등 아주 기초적인 것들을 알려준다. 그리고 기본적인 사칙연산, 문자열 줄나누기, input 함수 등을 설명해준다. 챌린지 문제들을 보고 직접 코드를 짜본 다음, 정답 코드와 비교하며 뭐가 맞았는지 부족한지 등을 알 수 있는 점이 재밌었다.

 

 

그 중 흥미로웠던 문제 두 가지를 소개한다.

 

챌린지 009
사용자로부터 일수(날짜 수)를 입력받아서 그 일수까지 몇 시간, 몇 분, 몇 초가 남았는지 출력하라.

 

이 문제를 보고 정확한 년원일을 받아서 해야하나 생각이 들었다. 그런데 그러면 기초치고 너무 어려울 것 같아서 그냥 간단하게 생각하기로 했다.

내가 짠 코드다.

 

# 9 
nowdate = int(input("today: "))
date = int(input("to date: "))
remain = date - nowdate
remainhour = remain * 24
remainmin = remainhour * 60
remainsec = remainmin * 60
print("left hour:", remainhour, "left minute:", remainmin, "left sec:", remainsec)

 

이 코드는 사용자에게 오늘 날짜(일)과 목표 날짜를 nowdate와 date변수에 저장하고, remain이라는 변수에 그 차를 구한다. 그리고 거기에 각각 시 분 초에 맞는 변수를 만들어주고 프린트하는 간단한 코드이다. 정답 코드에서도 뭐 이 비슷하게 해서 나름 만족하고 넘어가긴 했지만, 다음에는 시간을 20210808과 같은 포맷으로 받고 인덱스 슬라이싱을 해서 년월일로 나눈다음에 남은 일자를 계산해서 정확히 사용자에게 알려주고싶다.

 

 챌린지 011
사용자로부터 100이 넘는 숫자를 입력받고 10미만의 숫자 하나를 입력받은 후, 작은 숫자가 큰 숫자 안에 몇 번 들어가는지 사용자 친화적인 형식으로 출력하라.

 

이 문제는 내가 오해를 했는데, "큰 숫자 안에 몇 번 들어가는지"의 작가 의도는 만약 큰 숫자가 200이고 작은 숫자가 2이면 2가 200안에 100번 들어가니까(?) 100을 출력하라 인데, 나는 2가 200의 백의 자리에 하나 있으니 1을 출력하라라고 이해했다. 

그렇게 이해하고 짠 코드이다.

 

# 11
num1 = int(input("please input 100 or more: "))
if num1 < 100:
    print("must be 100 or more")
    num1 = int(input("please input 100 or more: "))
num1 = str(num1)

num2 = int(input("please input number between 0, 9: "))
if num2 >= 10:
    print("must be less than 10")
    num1 = int(input("please input number between 0, 9: "))
if num2 < 0:
    print("must be 0 or more")
    num1 = int(input("please input number between 0, 9: "))
num2 = str(num2)

print("당신이 두번째 선택한 숫자는 첫번째 선택한 숫자에", num1.count(num2), "개 있습니다.")

 

이 챌린지에서는 사용자가 제대로 인풋을 하지 않은 경우도 좀 생각을 해봤다. 첫번째 if문을 통해 처음으로 받는 숫자가 100보다 작을경우 다시 인풋을 받았고, 두번째 숫자도 10이 넘는 경우와 0보다 작은 경우를 고려했다. 그리고 count함수를 사용하기위해 두 숫자 모두 문자열로 바꿔주고, 함수를 사용해 큰 숫자 안에 작은 숫자가 몇 번 들어가는지를 찾아냈다.

 

이 코드에서 잘했다고 생각하는 점은 프로그램의 완성도를 위해 예외 상황에 대한 대처를 나름대로 했다는 것이다. 그럼에도 아쉬운점은 인풋에 숫자가 아닌 다른게 들어오면 프로그램이 잘 돌아가지 않을 것이라는 것이다. 하지만 너무 초반에 오래 머물러 있을 수는 없으니 다음 공부로 넘어가야겠다.

 

챌린지 009, 011 정답코드

# 9
days = int(input("Enter the number of days: "))
hour = days * 24
minutes = hours * 60
secondes = minutes * 60
print("In", days, "days there are...")
print(hours, "hours")
print(minutes, "minutes")
print(secondes, "secondes")

# 11
larger = int(input("Enter the number over 100: "))
smaller = int(input("Enter the number under 10: "))
answer = larger//smaller
print(smaller, "goes into", Larger, answer, "time")