본문 바로가기
개발일지/멀티캠퍼스 프로젝트형 AI 국비지원

2022.01.20 Day-4 피보나치수열 등

by 다니엘의 개발 이야기 2022. 1. 20.
320x100

오... 오늘은 뭔가 여러가지를 배웠다.

그 중에서도 중요한 부분 및 알아야 할 부분에 대해서 적어야 겠다.

적은적은 없지만

정리를 일부러 안하는 이유는 3가지다.

 

1. 남들이 보든 말든 사실 관심없다.

2. 검색용이다.

3. 진도의 속도 상 정리하기가 어렵다. 다 끝나면 다른 파이썬 강의 들어야 하고

정리까지하면 실력향상엔 분명한 도움이 되겠지만 그만큼 뭔가에 해롭겠지?

 

# Sequence
# - <class list>
# - <class tuple>
# 여러개의 데이터를 방을 이용해서 저장하는 자료구조.
# 실제 데이터를 가지고 있어요!

 

# -<class range>
# 숫자만 해당. 실제 데이터를 가지고 있지 않아요!

# a = range(초기값, 마지막값-1,증가값)
a = range(0,10,1) # 0, 1, 2, 3, 4
print(a)

# list, tuple 같은 경우 1,000,000개의 데이터를 가지고 있으면 실제 메모리양도 데이터 개수만큼 많이 필요
# range은 실제 데이터가 아닌 데이터의 영역(range)에 대한 의미만
# 저장하기 때문에 작은 메모리 공간으로 더 많은 데이터를 표현할 수 있다.

# 일반적으로 아래와 같이 사용
a = range(10) # range(0,10,1)를 생략해서 쓴것이다.


# 많이 사용하는 새로운 연산자 하나만 살펴보아요!
# 어제 했던 여러가지 연산자 => +, -, * ,/ , %, //, == ,is
# in 안에 있나요? => 불린 (논리연산자)



#####################################################################
#  indexing, slicing
a = range(10,50,1)
print(a[1]) # 11 indexing 가능
print(a[5:10]) # range (15,20) slicing은 원본의 type을 유지
########################################## 이부분은 좀 이해가 안간다.

 

# 2. Sequence Type
# <class list>
# <class tuple>
# <class range>

# 3. Text Sequence Type
# <class str>

 

################# 대문자로 바꿔주는 기능
a = "This is a sample text"
result = a.upper()
print(result)
##############################

 

a = "    이것은 소리없는 아우성     "
# 1. 이 문자열의 전체 길이는 얼마 인가요?
print(len(a))

######################## 몰랐었고, 기억해야하는 것
# 2. 문자열의 앞 뒤 공백을 제거하려면?
print(a.strip())
######################

 

######## 와... 
a = "show me the money"
# 3. 문자열 중 일부분을 다른 문자열로 변경하려면?
# ex) money -> code
a.replace("money","code")
###################

 

# 4. 문자열의 일부분을 치환하는 방법
##### 다른 format 방식은 쓸줄 안다. 하지만 이 방법은 몰랐다.
num_banana = 20
num_apple = 7

a = "나는 바나나를 {}개 가지고 있고 사과를 {}개 가지고 있어요!"
a.format(num_banana, num_apple)
#########################

 

# 4. Mapping class
# <class dict>

 

# dictionary (딕셔너리)
# dictionary를 만들기 위해서 사용하는 class => <class dict>
# literal 로 dictionary를 어떻게 표현하나요?

# list = []
# tuple = ()
# dict => {} list처럼 여러개의 자료구조를 담을 수 있다. != format의 {}
# {}를 이용하고 키와 value의 쌍을 저장하는 집합 자료 구조.
# 순서가 존재하지 않아요.
# 그러면 어떻게 여러개의 데이터를 저장하나요?

##############################Mapping type의 Dictionary
#딕셔너리 안에서 :의 의미는 키와 벨류를 구분해주는것
# a={
#     'name' : '홍길동',
#     'age' : 20 ,
#     'addr' : '서울'
    
# }
# # 위의 것을 a={name" : "홍길동","age" : 20 "addr" : "서울"}
# #이렇게 한줄로 만들어도 상관은 없다. 가독성을 위해서 분할 해놓은것이다.

# print(a)
# print(type(a))

# # 추가적으로 데이터를 저장하려면?
# a["mobile"] = "01033334444"

# print(a)

# # 값을 수정하려면?
# a ["age"] = 30
# print(a)

#################################################################

# a = {
#     "name" : "아이유",
#     "age" :20,
#     "age" : 30,
#     # 동일한 키값을 사용 할 경우, 가장 나중의 것으로 사용되고 먼저있는것은 사라진다.
# }

# print(a)

# a[10]= "서울"
# print(a)
# # 이처럼 항상 키값이 문자일 필요는 없다.


##################################################

 

#하지만

a = {
    "name" : "홍길동",
    ("address"): "서울"
    # Tuple은 사용가능하다. 왜냐하면 key 값으로는 변동이 없어야 key로써의 역할이 가능한데, list는 변동이 가능하고 Tuple은 아니기 때문이다.
}
# dictionary 자체가 key값을 얻어야 Value 값을 얻을 수 있는 구조이다.

# 모든 key 값을 언어내는 기능(함수)
print(a.keys()) # dict_keys(['name', 'address'])
#['name', 'address']
# 이거는 리스트처럼 생겼고, 리스트와 같은 기능으로 사용할 수 있지만, 리스트는 아니다.

# 모든 Value 값을 언어내는 기능(함수)
print(a.values())

# 모든 key와 value를 얻어내는 기능(메소드)
print(a.items())

a.clear() # dictionary 안의 모든 key, value를 모두 삭제한다.
print(a) # {}

 

# # Python built-in Data Type
# #1. Numeric Type
#  int
# float
# 2. Sequence Type
# list
# tuple
# range
# # 3. Text Sequence Type
#     <class str>
# # 4. Mapping Type
#     <class dict>
# # 5. Set type
#     <class set>
# 6. Bool Type
#<class bool>

 

# set은 주머니 개념. (막 담기 때문에 순서개념이 없다.)
# 여러개의 데이터를 저장할 수 있는 집합 자료구조
# 순서가 없다.
# 키의 개념이 없다. (연상해봐라 주머니에 갖은 물건들을 넣을때 일일이 키를 붙여서 넣는지 때문에 값만 저장한다.)
# # set안에서는 중복을 허용하지 않는다 (이게 set의 가장 큰 특징이다.)
# # leteral -> {} ( dictionary와 set은 둘다 {}를 사용)
# a = {"홍길동", "아이유", 20, "아이유", "홍길동"} #{'아이유', '홍길동', 20} 이처럼 중복으로 된 건 버려진다.
# print(a)

# a = set([1,2,3,4,4,4,4,4,4,]) # list(Tuple)을 이용해서 set을 만들 수 있다.
# print(a)

# set 의 연산 -> 합집합(Union), 교집합(intersetion), 차집합(difference)

# a = set([1,2,3,4,5])
# b = set([3,4,5,6,7])


# # 합집합(Union)
# result = a|b
# print(result) #{1, 2, 3, 4, 5, 6, 7}

# #교집합(intersetion)
# result = a&b
# print(result) #{3, 4, 5}

# #차집합(difference)
# result = a-b
# print(result)

a = {1,2,3}
a.add(6) #{1, 2, 3, 6}
print(a)
a.add("안녕") #{1, 2, 3, 6, '안녕'}
print(a)
a.add((45,)) #{1, 2, 3, 6, '안녕', (45,)} (Tuple을 add 시켰다는 걸 알아야한다.)
print(a)
# a.add([1,2,3,4]) #Error! list 를 넣으려고하면 에러가 난다.
# print(a)
# a.add({"name":"홍길동"}) #Error!
# a.add({6,7,8}) a.add({6,7,8}) 

# a = {1,2,3} # add는 1개만 추가, update는 여러개 추가
# a.update([6,7,8]) # list도 되는것같다 add와는 다르게
# print(a)

# a.remove(2)
# print(a)

 

# 6. Boolyen
# 기억해야할 사항
# 다음의 값들은 모두 False로 간주됨.
# 빈 문자열 ('') empty string -> False
# print(bool(''and True)) #False
# [], (), {}, 숫자 0

# control statement(제어문)
# if
# 조건에 따라서 어떻게 수행할지 사용.
# #for
# 내가 원하는 범위내에서 반복하고 싶을때

# #while
# 얼마나 출력을 해줄지 

# 제어문 - if
# 논리값을 기반으로 실행코드의 분기를 시키는 제어문
# if 논리값(논리연산의 값) (논리연산)

if 20<39:
    print("why")

 

#for statement (반복문)

a = [1,2,3,4,5]

# for kk in 대부분 리스트,튜플,레인지:|
    

# break 구문
# 반복문에서 사용되고 break를 만나면가장 가까운 반복문을 탈출.

a =0

while True:
    print("aa") # 딱 여기까지는 조건이 무조건 True이기 때문에 코드블럭에서 빠져나올 수가 없다. 무한히.
    a = a+1 # 때문에 이것을 넣어준다. 한계치로 점점 가까워지라고
    if a == 5:
        break
        
print("호호호")

 

# 기본, 기반이 되는 능력은 문제해결능력!
# 문제해결을 위해 머리속에서 생각되는 내용을 코드로 표현할 줄 알아야 한다. -> 코딩
# 코딩을 잘하려면 많이 해보는 것 밖에는 없다.
# 6개월 정도 기간을 잡는게 좋다.
# 하루에 적어도 3문제 정도. 자기 수준에 맞게끔

##################################### 아주 중요
# 코딩을 위한 여러 site
# 프로그래머스, 백준, 삼성SW Expert 아카데미.
##################################### 아주 중요

 

=========

여기서 부터는 문제를 내주셨다.

첫번째 문제가

 

10보다 작은 수 중에서 3과 5의 배수의 합을 구해라.

였다.

i = 0

total = 0

 

while i in range(10):

if i % 3 ==0:

    total +=i

elif i % 5 == 0:

    total +=i

    i +=1

print(total)

 

두번째 문제는 1000보다 작은 수 중에서 3과 5의 배수의 합을 구하는 거였고

이에 range()의 넘버값만 1000으로 바꿔주니 해결되었다.

 

문제는 세번째 문제였는데

단순 피보나치 수열구하기는 머리로 당장 생각해내기 어렵더라도

구글링하면 나오지 않나?

그래서 좀 배껴가면서 익혀갈 심산이였다. 하지만 조건이 붙었다.

 

4,000,000 이하의

짝수로 이루어진

피보나치 수열

 

음.....

아......

지금 3시간 정도 풀고 있는거 같다.

 

와중에

 

첫번째 시도 코드는

 

i = 1
total = 0
while i <= 4000000:
    if i % 2 ==0:
        total = i+ total
    i+=1
print(total)

 

두번째 시도 코드는

로딩이 걸려서 도무지 언제 끝날지 감이 안잡혔다.

 

front_number = 0
back_even_number = 1

for i in range(4000001):
    if (front_number + back_even_number) % 2 == 0:
        front_number = front_number + back_even_number
        back_even_number = front_number + back_even_number
    else:
        front_number += 1

print(back_even_number)

 

세번째 코드를 쓰기전의 문제를 다시 떠올리게 되었다.

"아.. 반복을 400만"번" 하는게 아니라, 400만 이하의 "숫자"니깐 다르겠구나"

 

세번째 코드는

 

front_number = 0
back_even_number = 1

while back_even_number<4000001:
    if (front_number + back_even_number) % 2 == 0:
        front_number = front_number + back_even_number
        back_even_number = front_number + back_even_number
    else:
        front_number += 1

print(back_even_number)

 

음.. 하지만 이것도 틀렸다고 하신다.

 

네번째 코드로

 

front_number = 0
back_number = 1
total_even_number = 0

while back_number<4000001:
    front_number = front_number + back_number
    back_number = front_number + back_number
    if back_number % 2 == 0:
        total_even_number += back_number

print(total_even_number)

 

라고 말씀드렸다.

 

선생님도 지치셨는지 아예 답을 알려주셨다.

사실 답을 알려주시는게 가장 합리적이지 ㅇㅇㅇ

왜냐하면 답을 안다고해서 코드를 알 수 있는건 아니지만

답이 맞을 때 까지 최소한에 스스로 검증해 볼 수 있으니깐

 

답은 4613732

라고 하셨다.

 

음.... 피보나치 수열 표를 보니 피보나치 수열 자체는 맞다.

근데 음... 뭐야 뭐가 문제야

 

하... 결국엔  total넘버에 front 넘버를 안넣어서 안맞는거였다.

아무튼 와... 이걸 해낼 수 있었다는 것 자체가 뿌듯하다. ㅇㅇㅇ

 

front_number = 0
back_number = 1
total_even_number = 0

while back_number<4000001:
    front_number = front_number + back_number
    back_number = front_number + back_number
    if back_number % 2 == 0:
        total_even_number += back_number
    elif front_number % 2 == 0:
        total_even_number += front_number
print(total_even_number)

 

이게 정답코드!!!!!!

 

아직은! 괜찮다

앞으로도 괜찮고 싶다. 알고리즘 문제를 푸는것을 게을리 하지 말자.

 

 

 

 

300x250